home *** CD-ROM | disk | FTP | other *** search
/ Shareware Super Platinum 8 / Shareware Super Platinum 8.iso / mac / DATABASE / ZIP.ZIP;1 / ZIPKEY.DOC < prev    next >
Encoding:
Text File  |  1990-01-19  |  160.4 KB  |  3,721 lines

  1. ZIPKEY zipcode directory program  V1.08      January 19, 1990
  2.  
  3. The entire package is Copyright 1989 Eric Isaacson.
  4. All rights reserved.
  5.  
  6.    Eric Isaacson Software
  7.    416 E. University Ave.
  8.    Bloomington, IN 47401-4739
  9.    (812)339-1811
  10.  
  11. PLEASE read Chapter 1 for legal terms, how to register/subscribe
  12. for the package, and the overview of the program.  Just type
  13. ZIPKEY if you don't like reading manuals.
  14.  
  15. This DOC file is an entire manual-- over 70 pages.  I have
  16. formatted this file so that it can be printed at 10cpi with
  17. margins.  To save space, I don't have a left margin in the file.
  18. You'll need to set your printer to a one-inch left margin to have
  19. room to punch holes for a ring binder.
  20.  
  21. This is an experimental version of ZIPKEY, preliminary to the
  22. V1.1 release.  I have added the ZIPKEY 7 command to uninstall
  23. ZIPKEY from memory, a zip-from-last keystrokes option to allow
  24. usage within graphic programs, and I have corrected some
  25. incompatibilities with other programs.
  26.  
  27. If you got ZIPKEY from an XYZ software house, that advertises
  28. great software for $5 per disk, and you are now confused as to
  29. your rights, you might ask the following
  30.  
  31. QUESTION: "What's going on here?  Have I already bought the
  32.   program, or what?"
  33.  
  34. ANSWER: Well, no, not exactly.  You've bought a disk that has
  35.   great software on it; unless you legally purchased the
  36.   registered version of ZIPKEY, you haven't bought the software
  37.   yet.  ZIPKEY, like most major software offered by the
  38.   $5-per-disk distribution houses, is free-distribution software
  39.   (also known as "shareware", or "user-supported software").
  40.   That means I retain the rights to ZIPKEY, but I choose to let
  41.   people pass the evaluation copy around.  I have no business
  42.   relationship with any distribution houses in the U.S.; I don't
  43.   get a penny of the $5 (or whatever) you paid them for the disk
  44.   containing ZIPKEY.  So I need and expect to be paid by you,
  45.   because I make my living out of making and supporting shareware
  46.   products.
  47.  
  48.   Some distribution houses do a pretty poor job of revealing the
  49.   shareware nature of the software they sell.  If you thought you
  50.   had purchased the software free and clear, you might feel
  51.   justified in being angry with them for having misled you.  And
  52.   you might look around for houses that do a better job of
  53.   informing the public.  But I hope you'll take the time to
  54.   consider everybody's role in the shareware marketing scene; if
  55.   you do, I think you'll conclude that although you may have been
  56.   misled, you haven't really been cheated out of anything.
  57.                                                               0-2
  58.  
  59.   Shareware is great for authors like me, who have spent all
  60.   their years in their computer holes, learning to be great
  61.   programmers, and no time in business school learning marketing
  62.   and distribution techniques.  We simply cast our programs to
  63.   the winds.  They are distributed at practically no cost to us.
  64.   That's why we can charge a lot less than the cost of
  65.   "commercial" software.
  66.  
  67.   Shareware is also great for customers like you.  You can try
  68.   out the software before paying for it.  You'll know that a
  69.   successful shareware product is good, because only satisfied
  70.   customers pay for it.  The existence of shareware infuses
  71.   healthy competition into the entire software market, for both
  72.   price and quality.  In the case of ZIPKEY, I'm utterly
  73.   convinced that you'll never find a better value for a zipcode
  74.   directory, anywhere.
  75.  
  76.   Finally, let's consider the distribution houses.  They provide
  77.   a legitimate service, for which they charge a reasonable price.
  78.   The best houses act as librarians, evaluating and cataloguing
  79.   software.  Most pay thousands of dollars for advertising.
  80.   Their cut is far less than the distributor's cut for
  81.   "commercial" software (they prosper because their volume is
  82.   bigger and their support responsibilities are smaller).  Most
  83.   customers for the distribution houses are repeat customers, who
  84.   are aware of, and happy with, what they are getting.  If it
  85.   weren't for your XYZ House, you might never have heard of
  86.   ZIPKEY, or might never have figured out where to obtain it.
  87.  
  88.   So I hope you'll be happy with shareware, and actively desire
  89.   to support it.  You'll feel good about promoting a healthy
  90.   situation for everybody.  And you'll encourage the best
  91.   programmers in the world to keep writing for you, instead of
  92.   for the big corporations.
  93.  
  94. Now that I've said that, let's move on to the package.   The
  95. ZIPKEY evaluation package consists of the program ZIPKEY.EXE, the
  96. database file ZIPKEY.OVL, and this manual ZIPKEY.DOC.
  97.  
  98.  
  99.  
  100. TABLE OF CONTENTS
  101.  
  102.  
  103. CHAPTER 1  INTRODUCTION AND LEGAL TERMS
  104.  
  105. Overview of This Manual                                     1-1
  106. Overview of ZIPKEY                                          1-1
  107. What ZIPKEY Doesn't Do                                      1-2
  108. Operating Requirements                                      1-3
  109. Legal Terms                                                 1-3
  110. Legal Conditions for Free Distribution                      1-4
  111. Sources and Copyright Status of ZIPKEY's Database           1-5
  112. Difference Between the Evaluation and Registered Versions   1-6
  113. Naming Conventions for Distribution                         1-7
  114. About the Author                                            1-8
  115. How to Contact Me                                           1-8
  116.                                                               0-3
  117.  
  118. CHAPTER 2  LOOKING UP ZIPCODES
  119.  
  120. Demonstration Mode                             2-1
  121. Signon Window                                  2-1
  122. Zipcode Search                                 2-2
  123. Arrow and Paging Keys During Zipcode Search    2-4
  124. State and City Search                          2-5
  125. Multiple Zipcode Cities                        2-6
  126. City Only Search                               2-7
  127. Moving From State to State                     2-7
  128. Unabbreviation                                 2-8
  129. Repeat Last Zipcode                            2-8
  130.  
  131.  
  132. CHAPTER 3  ZIPKEY CONFIGURATION
  133.  
  134. Determining Your Configuration Needs      3-1
  135. How to Create a ZC File                   3-2
  136. Default Options                           3-2
  137. Memory Model                              3-3
  138. Intermediate Results                      3-4
  139. Numlock On                                3-4
  140. Slow Down Keyboard                        3-5
  141. Window Characteristics                    3-5
  142. Monochrome and Color Window Settings      3-6
  143. Hotkey Configuration                      3-6
  144. Hotkey Name                               3-7
  145. Zipcode Source                            3-8
  146. Format of City/State/Zip Keystrokes      3-10
  147. Multiple Hotkeys                         3-12
  148. Exit Keys                                3-12
  149. Configuration Editing Menu               3-13
  150. Named Configuration Files                3-14
  151. Modifying Configuration Files            3-14
  152. More Hotkey Examples                     3-15
  153. Conclusion                               3-16
  154.  
  155.  
  156. CHAPTER 4  RUNNING MEMORY-RESIDENT ZIPKEY
  157.  
  158. Installing ZIPKEY as a Memory-Resident Program     4-1
  159. Correcting Your Configuration                      4-2
  160. Uninstalling ZIPKEY                                4-3
  161. Re-installing a New Configuration                  4-3
  162. Making ZIPKEY Permanently Available                4-4
  163. ZIPKEY and Other Memory-Resident Programs          4-4
  164. Finding ZIPKEY Files on Your Disk                  4-5
  165. Installing Files on a Network                      4-7
  166.  
  167.  
  168. CHAPTER 5 GENERATING AN ORDER FORM
  169.  
  170. Automatic Order-Form Generation            5-1
  171. ZIPKEY's Schedule of Prices                5-1
  172. Gathering Your Order Information           5-2
  173. Answering the Order-Form Questionnaire     5-3
  174. Possible Amendments to the Total Price     5-3
  175.                                                               0-4
  176.  
  177. CHAPTER 6 PROGRAMMATIC INTERFACE
  178.  
  179. The ZIPKEY Interrupt                6-1
  180. Testing for ZIPKEY's Presence       6-1
  181. ZIPKEY Calling Conventions          6-2
  182. The ZIPKEY Functions                6-3
  183. Sample Program Code                6-10
  184.  
  185.  
  186. INDEX
  187.  
  188. CHAPTER 1   INTRODUCTION AND LEGAL TERMS
  189.  
  190.  
  191. Overview of This Manual
  192.  
  193. Welcome to ZIPKEY!  I've tried to make the ZIPKEY program as
  194. self-explanatory as possible, so that you won't need to consult
  195. this manual very much.  I believe I have succeeded to the extent
  196. that if you're a somewhat experienced computer user, you'll be
  197. able to figure out the program on its own.  But ZIPKEY is a
  198. complex program with a fair number of sophisticated features.  If
  199. you're a less experienced computer user, or if you'd like to
  200. explore every nook and cranny of ZIPKEY's functionality, you'll
  201. want to read this manual.  It describes ZIPKEY in more detail
  202. than the built-in documentation, and provides examples you can
  203. work through as you read.
  204.  
  205. Some of this manual (especially in Chapters 2 and 3) tries to do
  206. double duty, as both a tutorial and a reference guide.  A
  207. tutorial is intended to be read from start to finish; it may
  208. contain a thread of discussion that runs from section to section.
  209. A reference guide is intended to be consulted a section at a
  210. time, to look up specific facts; it may repeat information so
  211. that the user doesn't need to read the whole manual to obtain the
  212. desired fact.  I've tried to keep the tutorial-vs.-reference
  213. annoyances to a minimum: the continuing (tutorial) threads are
  214. restricted to the more elaborate examples presented; I hope they
  215. are easy enough to pick up when you consult a section as a
  216. reference.  And I have tried to organize things to keep
  217. repetitions to a minimum, so you can read the manual as a
  218. tutorial.
  219.  
  220. I would, of course, like you to read this first chapter,
  221. including the legal terms and conditions pertaining to the
  222. program.  Then, if you're just getting started with ZIPKEY, you
  223. should read through Chapter 2 while running ZIPKEY in
  224. demonstration mode, to follow the examples and gain a familiarity
  225. with all of ZIPKEY's search capabilities.  Chapter 3 tells you
  226. how to configure ZIPKEY for memory-resident use, and Chapter 4
  227. tells you how to set up the files on your computer so that ZIPKEY
  228. is permanently available.  Chapter 5 gives you details about
  229. ZIPKEY's built-in facility for creating an order form to
  230. subscribe to ZIPKEY and regularly receive fresh data.  Chapter 6
  231. is for computer programmers who wish to access ZIPKEY's functions
  232. from within their programs.
  233.  
  234.  
  235. Overview of ZIPKEY
  236.  
  237. ZIPKEY is a complete city-level directory of 5-digit United
  238. States zipcodes, combined with a keyboard enhancement program.
  239. The goal of ZIPKEY is to provide enough power and flexibility so
  240. that no one with an IBM-PC (or hardware-compatible computer) will
  241. ever again have to manually type in the name of a United States
  242. city or town (at least not one big enough to have its own
  243. zipcode).
  244.                                                               1-2
  245.  
  246. When run as an ordinary program, ZIPKEY allows you to instantly
  247. access any of the 43000+ zipcodes in the directory, searching by
  248. zipcode, state-and-city, or city-only.  If you want to use ZIPKEY
  249. just to occasionally look up a zipcode, you simply choose
  250. main-menu option 2 and follow the prompts.
  251.  
  252. ZIPKEY achieves its full power when installed permanently in
  253. memory.  In this "memory-resident" mode, you can invoke ZIPKEY
  254. from within any other program (a word processor, a data-base
  255. manager, etc.).  You can type just a 5-digit zipcode, and ZIPKEY
  256. will fool the program you're running into thinking that you have
  257. typed any or all of the following: the city name, the state name
  258. and/or abbreviation, the zipcode, and any other combination of
  259. fixed keystrokes.  This "keystroke output" can be in any format
  260. that you wish.
  261.  
  262. ZIPKEY is completely configurable.  You can specify any
  263. combination of keystrokes (the "hotkey") that will invoke ZIPKEY
  264. when you're running another program.  You can also specify
  265. alternate hotkeys to allow differing sources of zipcode
  266. specifications (repeat the last zipcode, use a fixed sequence of
  267. first digits, or get the zipcode from your screen), and/or a
  268. differing format when ZIPKEY feeds the city/state/zip back
  269. through your keyboard.  You may have up to 99 different hotkeys.
  270. Your configuration is stored in a disk file, which is
  271. automatically read by ZIPKEY whenever it is invoked.
  272.  
  273. ZIPKEY has a sophisticated abbreviation algorithm, allowing you
  274. to specify a limit to the length of the city name, so that it
  275. will fit into a fixed field.
  276.  
  277. ZIPKEY's database is based on data from numerous sources,
  278. including the U.S. Postal Service.  It has been extensively
  279. cross-checked to ensure accuracy and consistency.  The data is
  280. highly compressed, so it won't occupy very much space on your
  281. disk or in memory.  The compression method was custom-designed
  282. for this database, providing for maximum compaction while
  283. retaining instant access.  It occupies less than 128K bytes (less
  284. than 3 bytes per entry), small enough to allow installation of
  285. the data base in either LIM-EMS or main memory.  But access to
  286. the data is fast enough so that it is perfectly reasonable to
  287. leave the database on your hard or RAM disk.
  288.  
  289.  
  290. What ZIPKEY Doesn't Do
  291.  
  292. ZIPKEY's database doesn't contain street names, so ZIPKEY can't
  293. tell you the exact zipcode for a street address within a city
  294. that has more than one zipcode.  Such a database would occupy
  295. megabytes, even with ZIPKEY's rate of compression.  Right now I
  296. consider that too big for mass distribution; but in the coming
  297. years, when storage capacities increase, I hope to offer such a
  298. database.
  299.                                                               1-3
  300.  
  301. ZIPKEY has been tested against all the major database managers,
  302. word processors, and spreadsheets, and works fine with the vast
  303. majority of them. But there are some programs that ZIPKEY is
  304. incompatible with.  Here are the problems that I know about and
  305. haven't been able to solve:  Keystroke playback doesn't work
  306. within Microsoft Works, which apparently ignores the usual
  307. keyboard drivers in your computer.  ProKey 2.1 causes problems,
  308. but 4.0 works fine.  Microsoft Word 4.0 doesn't allow typeahead
  309. within ZIPKEY's window so you must either disable intermediate
  310. results or type slowly -- Word 5.0 solved this problem.  NamePal
  311. 1.4 has a bug that limits playback to 15 keystrokes.
  312.  
  313.  
  314.  
  315. Operating Requirements
  316.  
  317. ZIPKEY requires an IBM-PC, IBM-PC AT, or 100% hardware-compatible
  318. computer with at least 256K bytes of memory, running MS-DOS V2.0
  319. or later.  A hard disk is not required but is recommended unless
  320. you have lots of memory to store ZIPKEY's data after it is
  321. installed.
  322.  
  323. Most of the "clone" computers work fine running ZIPKEY.  The
  324. areas of compatibility needed are in the memory-mapping of the
  325. video interface, the BIOS variables and buffers managing both
  326. video and keyboard, the timer-interrupt hardware, and the
  327. keyboard-interrupt mechanism.  Some computers are compatible
  328. except for the mapping of internal codes passed from the keyboard
  329. to the computer.  For those computers, ZIPKEY will work properly
  330. except during configuration, when the wrong names are displayed
  331. for the hotkeys.
  332.  
  333.  
  334. Legal Terms
  335.  
  336. ZIPKEY is a copyrighted work -- it is not and never has been in
  337. the public domain.  Each release of the ZIPKEY program comes in
  338. two versions: ZIPKEY.EXE, the evaluation copy, may be copied and
  339. distributed to others, subject to the conditions I'm about to
  340. describe.  The other version ZIPKEY.COM, the registered user's
  341. copy, is subject to the same legal restrictions as
  342. traditionally-distributed ("commercial") software.  Neither
  343. version has any physical copy-protection schemes.
  344.  
  345. WARNING: Before installing this or ANY new software, you should
  346. BACK UP any valuable data on your computer system.  ZIPKEY has
  347. been extensively tested on numerous different machines, and it is
  348. believed to be reliable and non-harmful.  However, software is
  349. the most complicated kind of product there is.  No mortal human
  350. can be absolutely and completely certain that a piece of
  351. complicated software will work on any given machine.  So you are
  352. completely responsible for determining the fitness or usability
  353. of this package.  I will not be liable for damages of any kind,
  354. including but not limited to lost sales or profits, arising from
  355. any failure of this package to perform as expected.
  356.                                                               1-4
  357.  
  358. If you have the evaluation copy ZIPKEY.EXE, I hereby grant you
  359. permission to install this version of ZIPKEY in its
  360. memory-resident mode for up to one month.  After that, you must
  361. either remove ZIPKEY from your system, or subscribe -- option 5
  362. of the main menu (described in detail in Chapter 5) will create
  363. an order form for you.
  364.  
  365. If you have the registered copy ZIPKEY.COM, you may install it
  366. only on those computers servicing the keyboards you have
  367. licensed.  You may make copies for backup and archival purposes.
  368. You may not allow the registered copy to be run from more
  369. keyboards than you have licensed.  The license for running ZIPKEY
  370. in its non-memory resident (demonstration) mode is permanent --
  371. you don't need to renew unless and until you want fresh data.
  372. The license for running ZIPKEY in its memory-resident mode
  373. (hotkeys, key playback, and/or program interface) is paid by the
  374. year, according to the rate schedule published in Chapter 5, and
  375. built into the order-form section of ZIPKEY, option 5 of ZIPKEY's
  376. main menu.
  377.  
  378. A simple registration for a single keyboard, with printed manual
  379. and one disk with the latest data, is $30.  Update disks are $25
  380. apiece.  Again, the license is permanent if you use ZIPKEY only
  381. in demonstration mode; it is good for one year if you use ZIPKEY
  382. in memory-resident mode.
  383.  
  384. If you are a casual user -- only calling up ZIPKEY occasionally
  385. in non-memory-resident mode for private, non-commercial use --
  386. then your subscription is optional.  You may send however much
  387. money you feel the program is worth to you.  If you send $30
  388. ($31.50 in Indiana), you'll get the printed manual and a disk
  389. with the registered version of the program and the most current
  390. database.  Your support is much appreciated, and will encourage
  391. the continued production of high-quality "try before you buy"
  392. software.
  393.  
  394. I reserve the legal right to change legal terms and prices for
  395. future versions without prior notice.  At the present time I have
  396. no plans to change prices until inflation has seriously reduced
  397. the value of the dollar (by, say, at least a third off its 1989
  398. value).  I will never consider you committed to a higher price
  399. before being advised of the price-- you'll always have the option
  400. to cancel your subscription and receive a refund for unused time.
  401.  
  402.  
  403. Legal Conditions for Free Distribution
  404.  
  405. Here are the conditions for free distribution of the evaluation
  406. version of ZIPKEY:
  407.  
  408. 1. You may copy the disk-file version of this manual, the
  409.    evaluation version ZIPKEY.EXE, and any version of ZIPKEY.OVL
  410.    more than six months old, and give them to anyone who accepts
  411.    all the legal terms spelled out in this chapter.  The copies
  412.    you distribute must be complete and unmodified.  You are
  413.    specifically prohibited from distributing the ZIPKEY.OVL data
  414.    in any unpacked format, or any format other than ZIPKEY.OVL.
  415.                                                               1-5
  416.  
  417.    Each ZIPKEY.OVL file that I distribute begins with a copyright
  418.    message containing the date after which the file can be
  419.    distributed freely.
  420.  
  421. 2. No part of ZIPKEY may be sold to anyone without my prior
  422.    written permission.  If the package is distributed on a
  423.    diskette, any fees collected must be specified as
  424.    materials/handling, and may not exceed $10 for the diskette.
  425.    Thus, I am allowing shareware distribution houses to
  426.    distribute the evaluation version of ZIPKEY, as long as they
  427.    don't try to deceive their customers into thinking they have
  428.    bought the full rights to the program.
  429.  
  430. 3. I reserve the right to prohibit specific individuals and/or
  431.    companies from distributing any or all of my copyrighted
  432.    works.  If I exercise this right, I shall inform such
  433.    individuals/companies in writing, by certified letter.
  434.  
  435.    So far, I have exercised this right against only one company,
  436.    Sizzleware.  They received a prohibition against distributing
  437.    my A86/D86 packages after they marked the packages Public
  438.    Domain in their catalog, and then neglected to change the
  439.    entry in the next catalog.  The subsequent catalog was
  440.    published three months after I wrote them and they wrote back
  441.    saying they would make the change.  It is my impression that
  442.    this was sheer carelessness on their part; but the mistake,
  443.    particularly after they were notified and had three months to
  444.    correct it, was a grave one.  I considered the prohibition
  445.    necessary to protect my copyright.  The prohibition was lifted
  446.    when they published a catalog with a corrected entry for
  447.    A86/D86.
  448.  
  449.  
  450. Sources and Copyright Status of ZIPKEY's Database
  451.  
  452. ZIPKEY's database consists of over 43000 zipcode entries,
  453. covering over 31000 different cities and towns.  It was created
  454. using numerous different references, most notably the data files
  455. provided by the U.S. Postal Service correlated against the cities
  456. and zipcodes from the 150000-entry database of a fair-sized mail
  457. order firm.  The latter "real-world" data provided much better
  458. accuracy in terms of the city names people actually use for their
  459. own addresses, as opposed to the Postal Service's
  460. officially-designated "primary city" for a zipcode.  The
  461. following references were also used, as a part of an extensive
  462. cross-checking and verification effort:
  463.  
  464.    * zipcode maps from several dozen telephone directories
  465.  
  466.    * U.S. Census data files
  467.  
  468.    * USPS National Five-Digit Zip Code & Post Office Directory
  469.  
  470.    * AAA Road Atlas
  471.  
  472.    * Rand McNally Commercial Atlas and Marketing Guide
  473.                                                               1-6
  474.  
  475.    * National Atlas of the United States of America
  476.  
  477.    * Rand McNally Road Atlas
  478.  
  479. The resulting ZIPKEY database differs by thousands of entries
  480. from any database that could be derived by mechanical means from
  481. any of the sources I have mentioned.  It is much more accurate
  482. than any of the sources for its purpose: to provide the city name
  483. actually used by the most people in a given zipcode.
  484.  
  485. So the ZIPKEY database contains a large body of information that
  486. is public knowledge, but at the same time represents a
  487. substantial creative compilation effort.  It enjoys the same
  488. copyright protection as other reference works, such as
  489. dictionaries, that contain compilation effort.  You may use the
  490. ZIPKEY database as a reference source, but you cannot simply
  491. unpack and publish the database without independently
  492. cross-checking and verifying the entire work, and adding
  493. substantial effort to make it your own.  If you do such
  494. unverified publishing, you will be in violation of federal
  495. criminal copyright law.
  496.  
  497. Note that a skilled programmer can use ZIPKEY's programmatic
  498. interface to unpack ZIPKEY.OVL into an ASCII format.  Again, I
  499. emphasize that the data in ASCII still contains my creative
  500. compilation effort, and is still under my copyright.  You may
  501. create and manipulate such a data file from the keyboards for
  502. which ZIPKEY is licensed, but you are specifically prohibited
  503. from distributing such data to non-licensed computers, or in any
  504. printed format.
  505.  
  506.  
  507. Difference Between the Evaluation and Registered Versions
  508.  
  509. The evaluation copy of ZIPKEY has full functionality.  The only
  510. differences between the evaluation and registered versions are as
  511. follows:
  512.  
  513. 1. The evaluation version is distributed as an EXE file, and the
  514.    registered version is distributed as a COM file.
  515.  
  516. 2. The version number, that appears on the console when ZIPKEY is
  517.    run and also on the signon popup window, has an "e" appended
  518.    to it for the evaluation copy, and an "r" appended to it for
  519.    the registered copy.
  520.  
  521. 3. Some of the help messages of the program are different, to
  522.    reflect the program's registered vs. evaluation status.  But
  523.    there is no missing information in the evaluation copy.
  524.                                                               1-7
  525.  
  526. 4. When you install in memory the evaluation copy of ZIPKEY on or
  527.    after the second month after you have created a ZC file,
  528.    ZIPKEY will remind you at installation time (typically when
  529.    the computer is started up) that you need to register, and
  530.    invite you to fill out an order form.  You can type N to the
  531.    invitation and ZIPKEY will be installed normally and work just
  532.    fine.  I'm just hoping you'll get tired of having to type that
  533.    N every time you start your computer, and send for the
  534.    registered copy.
  535.  
  536. 5. The evaluation copy will refuse to install a ZIPKEY.OVL
  537.    database whose free distribution is not yet allowed (less than
  538.    six months old).  If everyone follows the distribution rules,
  539.    this prohibition should never be encountered.
  540.  
  541.  
  542. Naming Conventions for Distribution
  543.  
  544. This section describes the naming conventions I'd like you to use
  545. when distributing files, especially on bulletin-board systems.
  546. I'm not putting any legal insistence behind these conventions;
  547. I'm just giving them so that there can be standardization.  If
  548. their names follow these conventions, my files should be easier
  549. to find on BBS's, and there should be less duplication of
  550. identical files with different names.
  551.  
  552. If you distribute files in a compressed format, using PKZIP, ARC,
  553. ZOO, or a similar program, I recommend that the evaluation
  554. ZIPKEY.EXE file and the manual be packed together into one file,
  555. and the ZIPKEY.OVL file be provided as a second file.
  556.  
  557. If you are a BBS sysop, with the ability to delete files on your
  558. BBS, you can maintain the single name ZIPKEY for the package.
  559. The compressed EXE-and-manual file can have the extension (.ZIP,
  560. .ARC, etc.) reflecting the compressing program used.  The OVL
  561. file can keep its name ZIPKEY.OVL.  ZIPKEY.OVL does not need to
  562. be compressed-- it's already so compact that there is little or
  563. no further gain from compression.
  564.  
  565. If you are uploading to a BBS on which you cannot delete the
  566. previous version, I suggest that the names contain the version
  567. information. The EXE-and-manual file should be named ZKxx, where
  568. xx is the ZIPKEY.EXE version number -- for example, ZK10.ARC for
  569. ZIPKEY V1.0e.  The ZIPKEY.OVL file should be stored using a
  570. compression program (not for the compression, which is minimal,
  571. but so that the file will be named ZIPKEY.OVL again when it is
  572. extracted).  The compressed OVL file should be named ZKmmyy,
  573. where mm is the 2-digit month and yy is the year of the ZIPKEY
  574. database -- for example, ZK0988.ARC for the September, 1988
  575. version of the data.
  576.  
  577. Here are sample directory lines for ARC files, including
  578. recommended comment lines:
  579.  
  580. ZK10.ARC         ZIPKEY zipcode dir V1.0 prog/doc, 1 of 2
  581. ZK0988.ARC       ZIPKEY.OVL 09/88 zipcode data,    2 of 2
  582.                                                               1-8
  583.  
  584. Note that the data file does NOT contain the program version
  585. number in its comment line.  I will be releasing new data files
  586. more often than new program versions, so that the data file is
  587. not married to the program version number.  People will be able
  588. to download new data files even if they already have the latest
  589. program version.
  590.  
  591.  
  592. About the Author
  593.  
  594. I am a professional software author.  I have been programming for
  595. myself since 1965, and professionally since 1975.  I worked for
  596. Intel Corporation for several years, first as a subcontractor,
  597. then as an employee, and then as an independent contractor.  I
  598. have also done contract work for numerous other software firms.
  599. In 1986 I started marketing programs directly to the public,
  600. releasing my A86 assembler and D86 debugger packages as
  601. shareware.  I have been making a living from A86/D86 receipts
  602. since 1987, supporting myself, my wife, and my daughter.  A86 is
  603. my first (computer) love, and I will continue to support and
  604. improve it-- ZIPKEY was developed using A86/D86, and I refuse to
  605. write code using anyone else's compilers.  But the market for
  606. assemblers is rather narrow, fiercely competitive, and
  607. surprisingly crowded with products.  I don't think I'll make
  608. enough from A86/D86 alone to see me through my retirement years.
  609.  
  610. Enter ZIPKEY.  In the summer of 1988 I was persuaded by a friend
  611. that the world needed a zipcode-directory and
  612. keyboard-enhancement program.  I naively thought I could complete
  613. the program in about ten weeks.  At my level of experience I
  614. should have known better-- the project has taken about seven
  615. months of full-time work.  (My only consolation for this
  616. scheduling embarrassment is that another friend of mine, with
  617. even more experience in computers than I have, thinks that he
  618. could have produced a marketable product in about one week!)  The
  619. resulting product is much more powerful and elaborate than the
  620. original vision.  The extra time spent also reflects the
  621. difference between a software tool and a professional-quality
  622. software product -- self-documentation, internal error detection
  623. for "bullet-proof" operation, configurability to anticipate a
  624. wide range of uses, and extensive testing in the field to enhance
  625. the program's design as well as its reliability.
  626.  
  627.  
  628. How to Contact Me
  629.  
  630. I have no plans to move from my present location at least through
  631. the millennium.  So you can write to:
  632.  
  633.     Eric Isaacson Software
  634.     416 East University Ave.
  635.     Bloomington, IN 47401-4739
  636.  
  637. or call (812)339-1811.
  638.                                                               1-9
  639.  
  640. Sorry, I can't guarantee to return everybody's long distance
  641. calls.  If you'd like to be SURE I'll get back to you, please
  642. invite me to call you back collect, or tell me to charge the cost
  643. of the call to your credit card.
  644.  
  645. I also accept BBS mail at PC-Link Central, (812)855-7252, which I
  646. try to check into daily.  Type J 3 when you get on that system,
  647. to reach my conference.  Another BBS which I check into about
  648. twice a week is Indiana On-Line, at (812)332-7227.  I also check
  649. into Compuserve every 10 days or so-- my ID number there is
  650. 71520,74.
  651.  
  652. PLEASE contact me if you find bugs in my programs; I'll fix them!
  653. I accept bug reports from anyone, registered or non-registered,
  654. no questions asked.  It's very frustrating to hear about people
  655. telling each other about bugs, and not telling me.  I still await
  656. Greg Wettstein's bug list.
  657.  
  658. CHAPTER 2   LOOKING UP ZIPCODES
  659.  
  660.  
  661. In this chapter we'll explore all of ZIPKEY's search
  662. capabilities, accessible from ZIPKEY's popup window.  As you read
  663. along, you can execute the examples given from ZIPKEY's
  664. demonstration mode, which pops up the ZIPKEY window without
  665. installing ZIPKEY as a program permanently resident in your
  666. computer's memory.  Occasionally I'll talk about what happens in
  667. the keystroke playback sequence, which occurs in ZIPKEY's
  668. memory-resident mode.  Those features will show themselves after
  669. you've configured ZIPKEY and then installed the program
  670. permanently in memory, as described in Chapters 3 and 4.
  671.  
  672.  
  673. Demonstration Mode
  674.  
  675. You can enter ZIPKEY's demonstration mode by selecting option 2
  676. from ZIPKEY's main menu, or directly from the DOS command prompt
  677. by typing
  678.  
  679.    ZIPKEY 2
  680.  
  681. followed by the Enter key.  If there is enough memory, ZIPKEY
  682. will load the entire zipcode database into memory for the
  683. demonstration.  If you are running ZIPKEY from a floppy disk,
  684. this will take a few seconds (but the subsequent searches will be
  685. breathtakingly fast if you're accustomed to floppy access speeds
  686. for data lookup).  After the data is loaded, ZIPKEY's window will
  687. pop up onto your screen, with the ZIPKEY signon message.  As long
  688. as any ZIPKEY window is on the screen, it will tell you what
  689. ZIPKEY expects you to be typing next, at or near the blinking
  690. cursor.  Whenever the popup window is visible (whether in
  691. demonstration mode or memory-resident mode), you can return to
  692. the signon window by pressing the Home key, or you can pop away
  693. the window by pressing the Esc key.
  694.  
  695. Whenever a zipcode specification is complete, ZIPKEY invites you
  696. to confirm the entry by typing the Enter key.  In demonstration
  697. mode, this will simply return you to the signon window, ready to
  698. type another specification.  Later, when you install ZIPKEY as a
  699. memory-resident program, the confirming Enter will initiate the
  700. keystroke playback sequence, in which ZIPKEY fools your computer
  701. (and whatever program you are running) into thinking you have
  702. typed a complete city/state/zip combination.
  703.  
  704.  
  705. Signon Window
  706.  
  707. The signon window contains information establishing my copyright
  708. and advertising my name and address.  It also tells whether you
  709. are running the evaluation copy of the program or the registered
  710. user's copy.  This information exists to remind you that ZIPKEY
  711. is not in the public domain, and that I appreciate being paid for
  712. my efforts.  But it doesn't waste your time-- you can start
  713. typing your zipcode specification right away.
  714.  
  715. The blinking cursor appears just beyond the prompt indicating
  716. each of the three types of zipcode search available to you:
  717.                                                               2-2
  718.  
  719. 1. If you type a digit (0 through 9), ZIPKEY treats it as the
  720.    start of a zipcode to look up.
  721.  
  722. 2. If you type a letter, ZIPKEY assumes you are typing a
  723.    two-letter state abbreviation, to be followed by a city name.
  724.  
  725. 3. If you type a question mark, you are signalling ZIPKEY that a
  726.    city name without a state will follow.
  727.  
  728. There is a fourth specification type, not mentioned explicitly on
  729. the window: the quote mark " to repeat the last zipcode.
  730.  
  731. We'll discuss each search type individually in the following
  732. sections.
  733.  
  734.  
  735. Zipcode Search
  736.  
  737. The zipcode search is simple: you type in a five-digit zipcode,
  738. and ZIPKEY instantly tells you the associated city, if there is
  739. one.  If there isn't, ZIPKEY will tell you, and try to make a
  740. guess as to what city it might be. You can either accept the
  741. guess with a confirming Enter key, correct the entry with the
  742. backspace key, or explore nearby zipcodes with the arrow keys
  743. (described shortly).
  744.  
  745. ZIPKEY is so fast that it can afford to display intermediate
  746. results as you type each digit of the zipcode.  Most people will
  747. ignore these results when typing in most zipcodes-- they are
  748. frills added to make ZIPKEY a little more convenient (and more
  749. fun).  Here is a description of what you see after each digit,
  750. that you can follow while typing the sample zipcode 47125:
  751.  
  752. 1. After you type one digit, ZIPKEY lists the possible states
  753.    having zipcodes with that first digit.  If a state from this
  754.    list has a zipcode after it, that is the only zipcode from
  755.    that state having the indicated first digit.  For example,
  756.    type 4 when you see ZIPKEY's signon window.  The list of
  757.    states includes Wisconsin 49936.  All of Wisconsin's zipcodes
  758.    start with 5, except Alvin, Wisconsin, which gets its mail
  759.    from a nearby Michigan post office and thus has a Michigan
  760.    zipcode.
  761.  
  762. 2. After two digits, ZIPKEY lists the ten zipcode regions that
  763.    begin with those two digits.  In our example, if you type the
  764.    second digit 7, you get a list of Indiana regions for zipcodes
  765.    beginning with 47: 470, 471, 472, etc.  If a third digit
  766.    yields no valid zipcodes, its line is blank on this display.
  767.                                                               2-3
  768.  
  769. 3. After three digits, ZIPKEY lists the main city for the zipcode
  770.    region.  Zipcodes are organized around three-digit regions:
  771.    all non-local mail is sorted according to region, and shipped
  772.    to a main center for that region.  Only when the mail reaches
  773.    the regional center is it sorted by the last two zipcode
  774.    digits.  Most cities listed by ZIPKEY are the postal service's
  775.    regional centers for those three digits, but many are not.
  776.    The exceptions are the regions surrounding large cities, in
  777.    which the cities themselves have their own first-three digits.
  778.    The postal service considers the large city to be the regional
  779.    center; ZIPKEY will instead typically give the name of a large
  780.    suburb within that region.  For example, the postal service's
  781.    regional center for 471 is Louisville, KY, which handles the
  782.    mail for nearby areas across the Ohio River in Indiana.
  783.    ZIPKEY gives the main city for 471 as Jeffersonville, IN,
  784.    because it gives a better sense of where the region is.
  785.  
  786.    If you type a three-digit combination for which there are no
  787.    valid zipcodes, ZIPKEY will tell you, and ignore any
  788.    subsequent digits typed.
  789.  
  790.    Also included in the three-digit message is a reminder about
  791.    arrow keys during zipcode entry.  We'll discuss arrow keys
  792.    shortly.  The message applies just as well when any number of
  793.    digits are typed-- I placed it there in the three-digit case
  794.    because there is room on the window for it, and because I
  795.    wanted to let people who never read manuals know that the
  796.    feature exists.
  797.  
  798. 4. After four digits, ZIPKEY lists the city for each of the ten
  799.    possible values for the final digit.  If a final digit does
  800.    not have a valid city, its line is left blank.  For example,
  801.    after 4712, you'll see the listing of cities for 47120, 47121,
  802.    47122, etc.
  803.  
  804. 5. Finally, after 5 digits are typed, you get the city, with the
  805.    invitation to confirm the entry with the Enter key.  If there
  806.    is no city for this zipcode, ZIPKEY will guess the last valid
  807.    zipcode's city, or, if the zipcode is before the first or
  808.    beyond the last valid zipcode for the region, ZIPKEY will
  809.    guess the main city for the region.
  810.  
  811.    In demonstration mode, the confirming Enter key will put you
  812.    back to the signon window, ready to type in another zipcode
  813.    specification.  Later, when you run ZIPKEY as a
  814.    memory-resident program, the confirming Enter will pop away
  815.    the window and play the city/state/zipcode combination through
  816.    your keyboard.  The guessed city will be used if the zipcode
  817.    did not exist.  If you don't want the guessed city to be used,
  818.    you exit via the Esc key, and type in the city/state/zip
  819.    yourself.
  820.                                                               2-4
  821.  
  822. Arrow and Paging Keys During Zipcode Search
  823.  
  824. To allow exploration of ZIPKEY's database, ZIPKEY allows you to
  825. use the up-arrow, down-arrow, PgUp, and PgDn keys at any time
  826. during the entry of a zipcode.  These keys either add or subtract
  827. 1 from the value already typed, letting you "move" through the
  828. database.
  829.  
  830. The up-arrow key subtracts 1 from the digits typed (reflecting
  831. the fact that if the zipcodes were listed in order on a page, the
  832. zipcodes would decrease as you move physically up the page).  The
  833. down-arrow key adds one to the digits typed.  For example, if you
  834. type the single digit 0 to ZIPKEY's signon window, you'll get the
  835. list of states whose zipcodes begin with 0.  You can now press
  836. the down-arrow key repeatedly, to get the states lists for 1, 2,
  837. 3, etc.  You can go backwards by pressing the up-arrow key.
  838. Likewise, you can type the two digits 00 to ZIPKEY's signon
  839. window, then press down-arrow repeatedly to get successive lists
  840. of main region cities.  The value will increment from 09 to 10,
  841. so that the entire list of regions can be cycled through with 100
  842. presses of the down-arrow key.  You get similar results after 3,
  843. 4 and 5 digits -- the 4-digit case is most useful, letting you
  844. page through the individual cities in order.  Holding the
  845. down-arrow key down for auto-repeat with 4 digits typed will give
  846. you a sense of the sheer size of ZIPKEY's database, all packed
  847. into your computer's memory.
  848.  
  849. The PgUp and PgDn keys don't provide any radically new
  850. functionality over the up- and down-arrow keys: they simply work
  851. because you might subconsciously think you are in a
  852. word-processor, and expect them to work.  If you press PgUp or
  853. PgDn after 1, 2, or 4 digits are pressed, you get exactly the
  854. same action as the corresponding arrow key.  If you press PgUp or
  855. PgDn after 3 or 5 digits are pressed, ZIPKEY will drop you back
  856. to the 2- and 4-digit cases, respectively, to give you the
  857. "paging" action you might have expected.  If you have configured
  858. ZIPKEY not to display intermediate results (see Chapter 3 for how
  859. to do this), the PgUp and PgDn keys will temporarily enable the
  860. intermediate-results display.
  861.  
  862. Note that these "exploration" keys do not place you into any
  863. special mode: when the typed zipcode increments or decrements, it
  864. is just as if you had typed in the new digits in the first place,
  865. and you can continue typing the zipcode from the new value.  For
  866. example, any of the following keystroke sequences will get you
  867. from the signon window to zipcode 12345:
  868.  
  869.    12345
  870.    0{down}2345
  871.    2{up}2345
  872.    119{down}{down}{down}{down}45
  873.                                                               2-5
  874.  
  875. State and City Search
  876.  
  877. Now we'll discuss the case in which you know the city and state,
  878. and you want to look up the zipcode.  For this case, you start
  879. from ZIPKEY's signon window, and type the two-letter abbreviation
  880. for the desired state.  If you don't remember what the
  881. abbreviation is, don't worry: just type the first letter of the
  882. state's name, and you'll get a display of all the states, with
  883. their abbreviations, that begin with that letter.
  884.  
  885. Your entry of either the state code or the city name can be in
  886. either lower-case or upper-case: ZIPKEY doesn't care.  I give
  887. them in upper case in the following paragraphs just to make them
  888. easier for you to read.
  889.  
  890. After you type the two-letter state abbreviation, ZIPKEY prompts
  891. you for the city name.  As you type the city, ZIPKEY will look up
  892. all cities within that state that start with the letters you have
  893. typed so far.  As soon as there are 50 or fewer matching cities
  894. (usually after only one or two letters), ZIPKEY generates a
  895. display of matching cities.
  896.  
  897. For example, suppose you need to know the zipcode for Robinson,
  898. Illinois.  When you see the ZIPKEY signon window, you can type IL
  899. for Illinois, followed by the city name.  There are more than 50
  900. towns in Illinois whose name begins with R, so you don't get a
  901. display if you type just R.  But after you type the second letter
  902. O, a display is generated.  You may continue typing the city name
  903. until there is only one city left.  Or, once there is a display
  904. of cities, you can type a digit to select one of the cities on
  905. the list.  In the database current to this writing, Robinson is
  906. on the line numbered 3 in the RO display, so the complete
  907. specification ILRO3 will select Robinson.  In the ROB display
  908. Robinson moves up to number 2, so that ILROB2 would also select
  909. Robinson.  Robinson is the only city in Illinois starting with
  910. ROBI, so ILROBI would also select Robinson.
  911.  
  912. If there are more than ten cities in the generated display,
  913. you'll see PgDn displayed off the end of the tenth city.  This is
  914. your indication that the PgDn key will give you more cities.  If
  915. you type PgDn once, you'll get the second ten cities that match
  916. what you've typed so far.  A PgUp appears above the top right of
  917. the cities list, to signal that you can now page back to the
  918. first ten cities.  If there are still more cities beyond this
  919. group of ten, the PgDn indicator will remain.  For example,
  920. suppose you want to view all cities in Oregon whose name begins
  921. with the letter B.  You type ORB to the ZIPKEY signon window,
  922. followed by several PgDn keys to reveal several pages of Oregon
  923. "B"-cities.
  924.                                                               2-6
  925.  
  926. Multiple Zipcode Cities
  927.  
  928. If you perform a city search for a city having more than one
  929. zipcode, ZIPKEY will give you the complete list of zipcodes for
  930. that city, but it can't tell you which zipcode matches your
  931. address-- that's beyond the scope of ZIPKEY's city-level data
  932. base.  In this case, once the search has narrowed down to the
  933. single city, ZIPKEY invites you to complete the zipcode with the
  934. trailing digits it needs to resolve the multiple-zip ambiguity.
  935. In ZIPKEY's demonstration mode, this will serve no purpose other
  936. than to show you how the window will work in memory-resident
  937. mode.  In memory-resident mode, the digits you type are needed to
  938. provide the complete zipcode in the keystroke playback of
  939. city/state/zip.  If you type a confirming Enter at a time that
  940. ZIPKEY is prompting you to complete the digits of a zipcode,
  941. ZIPKEY will fill out the zipcode with x's, just as you might do
  942. when addressing an envelope with a zipcode whose final digits you
  943. don't know.
  944.  
  945. For example, suppose you wish to look up the zipcode for
  946. Worcester, MA.  You type MAWORCES to the ZIPKEY signon window,
  947. which is more than enough to narrow the display to the single
  948. city.  Worcester has numerous different zipcodes, all beginning
  949. with 016.  ZIPKEY places the blinking cursor after the common
  950. digits 016, and invites you to complete the zipcode.  If you type
  951. 01, the prompt changes to a confirming Enter, and you'll get a
  952. keystroke playback of 01601 as the zipcode.  If you type Enter
  953. right away instead of 01, you'll get 016xx as the zipcode.
  954.  
  955. A note about the list of zipcodes for a city: it consists of a
  956. sequence of either individual zipcodes or zipcode ranges.  In a
  957. zipcode range, the first and last zipcodes are always valid
  958. zipcodes for the city displayed.  There will be no zipcodes in
  959. the range that represent a city different than the one displayed.
  960. However, there may be zipcodes within the range that are
  961. undefined.  For example, in the database current at this writing,
  962. the range 01613-55 for Worcester, MA represents a range running
  963. from 01613 to 01655.  You can view the range in detail if you
  964. switch back to zipcode lookup: type Home to return you to
  965. ZIPKEY's signon window, then type 0161 followed by four presses
  966. of the down-arrow key.  You'll see that there aren't any
  967. non-Worcesters between 01613 and 01655, but that most of the
  968. range is undefined.
  969.                                                               2-7
  970.  
  971. City-Only Search
  972.  
  973. ZIPKEY also allows you to search for a city name without
  974. specifying the state.  To use this feature, you type a question
  975. mark to the ZIPKEY signon window.  ZIPKEY will prompt for the
  976. city name, and tell you to press the Enter key when you want the
  977. search to begin.  This search requires ZIPKEY to walk through the
  978. entire zipcode database, which is too slow to display
  979. intermediate results.  You may type either a partial name (the
  980. first few characters), or a complete name.  When you press the
  981. Enter key, ZIPKEY will change the state display to the first
  982. state containing a matching city name, and list the matching
  983. cities.
  984.  
  985. If there are no matching cities, ZIPKEY tells you, and invites
  986. you to correct the entry with the backspace key.  Remember, you
  987. don't have to type the whole city name-- the first few letters
  988. may narrow the possibilities enough for you to find your city
  989. without risking a misspelling.
  990.  
  991. Let's do a sample city-only search.  There's a commercial on TV
  992. in which a woman tells how they prepare Shredded Wheat back home
  993. in Nome.  A co-worker replies, "I didn't know you were from
  994. Alaska.", to which the woman replies, "I'm not; I'm from Nome,
  995. Texas."  As a vigilant ZIPKEY user, you wish to know if there are
  996. any other Nomes out there.  You type ?NOME followed by the Enter
  997. key to the ZIPKEY signon window.  ZIPKEY displays the first
  998. state, Alaska, containing a Nome.  Now read on to the next
  999. section to see how to get the other Nomes.
  1000.  
  1001.  
  1002. Moving From State to State
  1003.  
  1004. The city-only search just described will give you just the first
  1005. state containing a matching city.  To move on to subsequent
  1006. states, you press the down-arrow key.  So, from our previous
  1007. example, when you have Nome, Alaska selected, you press the
  1008. down-arrow key to find the next state containing a matching city.
  1009. ZIPKEY reveals a hitherto-unrevealed Nome, in North Dakota.
  1010. Pressing down-arrow again moves the display to the Nome, Texas of
  1011. the Shredded-Wheat woman.  Another down-arrow cycles us back to
  1012. Alaska, so we conclude that there are exactly three Nomes in the
  1013. database.
  1014.  
  1015. What happens when there is a state containing a matching city,
  1016. but that is the only such state?  If you press down-arrow, ZIPKEY
  1017. will take several seconds to try to find another state, then
  1018. return to the same display.  You can tell that the search is
  1019. complete because the blinking cursor goes to the state code
  1020. during the search, then returns to the city name when the search
  1021. is over.
  1022.                                                               2-8
  1023.  
  1024. Again, I've tried to minimize the number of special modes in
  1025. which you can be.  When you perform a city-only search, and reach
  1026. the first state, it is just as if you had typed that state's code
  1027. instead of ? in the first place.  Conversely, if you type a
  1028. state-and-city specification, you can move to other states with
  1029. that same city specification by pressing the down-arrow key to
  1030. move to the next state; or the up-arrow key to move to the
  1031. previous state containing a matching city.
  1032.  
  1033.  
  1034. Unabbreviation
  1035.  
  1036. For consistency and completeness, ZIPKEY's data base stores all
  1037. city names in a totally unabbreviated form, spelling out words
  1038. such as Saint, Sainte, Fort, Mount, North, South, East, and West.
  1039. (The one exception is the word "National" in cities containing
  1040. the phrase "National Park", which is stored as "Natl".  I wanted
  1041. to minimize the number of excessively long city names.)  The
  1042. unabbreviated forms will not cause a problem for you if you need
  1043. to fit your city name into a fixed field, because ZIPKEY does a
  1044. good job of abbreviating names as necessary to fit in such fields
  1045. (details are in Chapter 3).  But you might forget to spell out a
  1046. name such as St. Louis when typing a city specification that you
  1047. would like ZIPKEY to search.  So ZIPKEY allows the abbreviations
  1048. St, Ste, Ft, Mt, N, S, E, and W for the above-mentioned full
  1049. names.  The abbreviations must be followed by a period or a space
  1050. for ZIPKEY to accept them.
  1051.  
  1052. For example, suppose you type MNST to the ZIPKEY signon window.
  1053. You'll get a list of Minnesota cities beginning with ST, and none
  1054. with Saint.  But if you now type a period or space, ZIPKEY will
  1055. switch to a list of Saint cities.
  1056.  
  1057.  
  1058. Repeat Last Zipcode
  1059.  
  1060. Finally, we cover a fourth specification that can be typed from
  1061. ZIPKEY's signon window-- a double-quotes mark " to call up the
  1062. last zipcode returned.  This option exists to accommodate hotkeys
  1063. that repeat the last zipcode specified, and also hotkeys that
  1064. play back a keystroke sequence unrelated to any zipcode.  These
  1065. possibilities are covered, with examples, in Chapter 3, in the
  1066. fixed-keystrokes option of the Zipcode Source section.
  1067.  
  1068. Typing the quotes mark " causes ZIPKEY to display the previous
  1069. zipcode, city, and state found, and immediately prompt for the
  1070. confirming Enter key.  The "previous" zipcode specification
  1071. starts out nonsense (Aaron, AL 00000 in the current database at
  1072. this writing) until a real zipcode is looked up.  The "previous"
  1073. specification does not change if a lookup is cancelled via Home
  1074. or Esc -- it changes only after the confirming Enter or alternate
  1075. exit key is pressed.
  1076.  
  1077. CHAPTER 3   ZIPKEY CONFIGURATION
  1078.  
  1079.  
  1080. In this chapter we discuss how you can tailor ZIPKEY to your
  1081. specific needs.  You can choose where the zipcodes are stored
  1082. when ZIPKEY is loaded into your computer's memory, which keys you
  1083. will press to invoke ZIPKEY, the location and color of the ZIPKEY
  1084. popup window, and the format for the city/state/zip combination
  1085. to be played back though your keyboard.
  1086.  
  1087. These adjustable selections for ZIPKEY are stored in a special
  1088. file on your disk, called a ZC (for ZIPKEY Configuration) file.
  1089. Every time ZIPKEY is installed in your computer's memory, a ZC
  1090. file is automatically read, to determine all of the configuration
  1091. choices you made.
  1092.  
  1093.  
  1094. Determining Your Configuration Needs
  1095.  
  1096. Before you attempt to create a ZC file, you should spend a little
  1097. time exploring how you are currently typing in addresses.  In
  1098. order to let ZIPKEY fool the computer into thinking you have
  1099. typed in a complete city/state/zip, you'll have to tell ZIPKEY
  1100. exactly what you type-- this can include preliminary positioning
  1101. keystrokes, intervening keystrokes for punctuation, spacing, or
  1102. further positioning, and trailing keystrokes for termination or
  1103. still more positioning.
  1104.  
  1105. For example, suppose that you use two different programs to enter
  1106. addresses: a database management program and a word processor.
  1107. Before you try to configure ZIPKEY, you should invoke each
  1108. program and type in a sample address.  You enter the database
  1109. manager, which puts an address template onto the screen.  You
  1110. type in a name and an address, noticing that you use the Enter
  1111. key to move from field to field.  You press the Enter key to
  1112. reach the start of the city field.  At this point, you should
  1113. count the number of available spaces in the city field.  If this
  1114. is visually difficult, the sample name you type can assist you:
  1115. type Xxxx xxxx xxxx xxxx etc. to mark spaces.  Let's suppose
  1116. there are 17 spaces available.  Make a note of this number:
  1117. ZIPKEY will need it.  You press the Enter key to advance the
  1118. cursor to the two-letter state abbreviation field.  You type a
  1119. sample two-letter state code, and notice that the cursor
  1120. automatically advances to the zipcode field without your typing
  1121. Enter -- such a detail is important for the accurate recording of
  1122. the keystroke sequence.  Finally, you type the five-digit zipcode
  1123. and notice that another Enter is required to advance the cursor
  1124. to the next field.  So the exact keystroke sequence for getting
  1125. from the last field before the city to the first field after the
  1126. zipcode is:
  1127.  
  1128. {Enter}C{Enter}AZ{Enter}
  1129.  
  1130. where the variable parts of the entry are denoted by the letters
  1131. C,A,Z.  Again, the lack of an {Enter} between A and Z reflects
  1132. the fact that the cursor moves automatically from the state
  1133. abbreviation to the zipcode field.
  1134.                                                               3-2
  1135.  
  1136. Now you discard the sample record you have created, exit your
  1137. database manager, and invoke your word processor.  You use this
  1138. program to type letters: addresses are typed in as a letterhead.
  1139. The format consists of the city name, a comma, a space, the
  1140. two-letter state abbreviation, a space, the zipcode, and two
  1141. Enter keys.  In our notation, this is
  1142.  
  1143. C, A Z{Enter}{Enter}
  1144.  
  1145. with no limitation to the length of the city name.  You have now
  1146. gathered the information needed for a ZIPKEY specification.  You
  1147. can exit your word processor and invoke ZIPKEY's configuration
  1148. option, described in the next section.
  1149.  
  1150.  
  1151. How to Create a ZC File
  1152.  
  1153. You create a ZC file by selecting ZIPKEY main menu option 3,
  1154. "Configure ZIPKEY for memory-resident use".  You may also go
  1155. directly to this option from DOS's command prompt, by typing
  1156. ZIPKEY 3 followed by the Enter key.
  1157.  
  1158. When option 3 is selected, ZIPKEY tells you whether a ZC file
  1159. already exists, and gives you options just in case it wasn't what
  1160. you expected.  Type N if the file didn't exist, and 2 if it did,
  1161. to walk through a complete configuration.
  1162.  
  1163.  
  1164. Default Options
  1165.  
  1166. The following sections describe each configuration option you'll
  1167. encounter.  Before we begin each option, however, let's discuss a
  1168. feature that covers the entire ZIPKEY configuration process: the
  1169. default option.
  1170.  
  1171. In most situations during ZIPKEY configuration, ZIPKEY attempts
  1172. to discern what option it thinks you are most likely to select.
  1173. It will display that option underneath the current cursor
  1174. position as it waits for your response.  If you wish to select
  1175. this default option, you may do so explicitly by retyping the
  1176. already-displayed selection.  But you can also select the default
  1177. option by simply pressing the Enter key.
  1178.  
  1179. If you are respecifying a previously-existing configuration, the
  1180. default options will be those from the old file.  You can press
  1181. Enter for those sections that you don't want to change.  If you
  1182. are configuring for the first time, the default is the option
  1183. that I think most people will choose.  If you are confused by an
  1184. option and aren't sure what to select, press Enter to get the
  1185. default setting.
  1186.                                                               3-3
  1187.  
  1188. Memory Model
  1189.  
  1190. ZIPKEY consists of two parts: the ZIPKEY program that controls
  1191. ZIPKEY's functions, and the database that contains the zipcodes
  1192. themselves.  When you install ZIPKEY as a memory-resident
  1193. program, the ZIPKEY program is always installed in your main
  1194. computer memory -- it occupies about 20000 bytes (20K of the 640K
  1195. available in most late-model computers).  You don't have any
  1196. choice as to where the ZIPKEY program is stored.  However, you do
  1197. have a choice as to where the database (occupying about 128K) is
  1198. stored:
  1199.  
  1200. 1. You may have the database stored in Lotus-Intel-Microsoft
  1201.    expanded (EMS) memory.  This is a special kind of memory,
  1202.    provided by add-on boards such as Intel's AboveBoard, designed
  1203.    to break the 640K memory capacity "barrier" of the IBM-PC
  1204.    family.
  1205.  
  1206.    If you're not sure whether your system has EMS memory, don't
  1207.    worry: ZIPKEY determines this for you, and makes this option
  1208.    the default if there is sufficient EMS memory available to
  1209.    load the database.
  1210.  
  1211.    If this option is available to you, it is usually the best.
  1212.    It allows the fastest access to the database without occupying
  1213.    main memory, and it avoids any potential problems resulting
  1214.    from attempting to access the disk from a popup utility.
  1215.  
  1216. 2. You may keep the database on your disk, causing ZIPKEY to
  1217.    access the database file every time it looks up a zipcode.
  1218.    This option is slower than the other two options, but not too
  1219.    slow: only two disk read operations (maximum 400 bytes and
  1220.    usually much less) are required to look up each zipcode entry.
  1221.    On a hard disk this takes a small fraction of a second.
  1222.  
  1223.    There is another potential problem with disk access on local
  1224.    area networks (LANs).  I have tested ZIPKEY on several
  1225.    networks, and on all networks it works fine in all modes, with
  1226.    one exception: on a Network-OS network in which the data comes
  1227.    from the disk (not necessarily on the network) ZIPKEY will
  1228.    often refuse to pop up its window until you exit your program
  1229.    and go back to the DOS command prompt.  Much diagnosis
  1230.    revealed that Network-OS was mismanaging an internal DOS flag
  1231.    (InDOS), and deceiving ZIPKEY into thinking DOS was constantly
  1232.    busy.  I have tried repeatedly to persuade CBIS, the company
  1233.    that markets Network-OS, to provide me with some meaningful
  1234.    technical support on this, and so far they haven't.  So if you
  1235.    have the just-described troubles on your network, you may
  1236.    refrain from getting your data from the disk.  Either EMS or
  1237.    main memory work fine on all networks I have tried.  Meanwhile
  1238.    I can't recommend Network-OS-- their system seems to have a
  1239.    bad bug, and their technical support was useless, at least to
  1240.    me.
  1241.                                                               3-4
  1242.  
  1243. 3. You may load the database into main memory.  This allows the
  1244.    same fast access as the EMS option (maybe even a shade
  1245.    faster), but it means that every other program running on your
  1246.    computer will have 128K bytes less memory to work with.  There
  1247.    are many situations in which this won't be a problem: for
  1248.    example, if the computer is dedicated as a workstation for
  1249.    order entry, you can experiment to see if it works just as
  1250.    well with ZIPKEY's data stored in main memory.  If it does,
  1251.    fine: you get the fastest access without having to buy an EMS
  1252.    memory board.
  1253.  
  1254.  
  1255. Intermediate Results
  1256.  
  1257. As an added convenience (and also for fun!) ZIPKEY is capable of
  1258. displaying what it knows about the specification you have typed
  1259. so far.  For example, if you have typed in exactly 4 of the 5
  1260. digits of a zipcode, ZIPKEY will display a list of the 10
  1261. possibilities for the fifth digit.  If you type a partial
  1262. specification and then use the up-arrow, down-arrow, PgUp, and
  1263. PgDn keys, you can "explore" the database.
  1264.  
  1265. There are two reasons why you might want to suppress the display
  1266. of intermediate results: first, to avoid the time it takes to
  1267. look them up.  If you are getting the zipcode data from a slow
  1268. disk, or you are running on an older slow (4.77 MHz) computer,
  1269. then the results are likely to lag a bit behind your typing.  The
  1270. lag is typically no more than about a second-- it's a matter of
  1271. taste whether this is acceptable to you.  The second reason for
  1272. suppressing intermediate results is purely a matter of taste: you
  1273. might be visually annoyed by all that unused information flashing
  1274. past as you type.  If that is the case, however, you may wish to
  1275. choose the option (described later) of taking zipcodes from the
  1276. screen -- that way you can arrange for ZIPKEY's window not to pop
  1277. up at all, which absolutely minimizes the visual distraction.
  1278.  
  1279.  
  1280. Numlock On
  1281.  
  1282. This is a feature inspired by the possibility of using the 5 key
  1283. on the numeric keypad as the "hotkey" that will pop up ZIPKEY's
  1284. window.  If you habitually compute with Numlock turned off, the 5
  1285. key has no other useful function.  If that is the case, since
  1286. your hand is already on the numeric keypad, you may wish to keep
  1287. it there to type in the zipcode.  By selecting this option, you
  1288. are instructing ZIPKEY to activate Numlock when its window pops
  1289. up.  ZIPKEY will restore the old status of Numlock when the
  1290. window pops away.
  1291.                                                               3-5
  1292.  
  1293. Slow Down Keyboard
  1294.  
  1295. This option insures that ZIPKEY doesn't provide keystrokes too
  1296. fast for your program to successfully digest.  To be on the
  1297. conservative side, you should select Y for this option when you
  1298. configure ZIPKEY for the first time.  Then, after you have ZIPKEY
  1299. working, you can try changing this option to N, so that the
  1300. entire city/state/zip combination appears instantaneously in your
  1301. program.
  1302.  
  1303. Two programs that definitely need Y are the Condor database
  1304. system, and older versions of the Wordstar word processor.
  1305.  
  1306. If you select N when you needed Y, you'll see missing keystrokes
  1307. in the playback of city/state/zip.  The problem exists in some
  1308. modern programs, but it is most common in older programs.  The
  1309. problem was made widespread when Borland, in its Turbo Pascal
  1310. version 2, published a recommended procedure for programs to
  1311. fetch keystrokes from the computer.  The procedure involved
  1312. fetching each keystroke two or three times, relying on the fact
  1313. that no human could type the next key before such multiple
  1314. fetches were made.  This programming method did not foresee the
  1315. advent of keyboard enhancement programs such as SmartKey, ProKey,
  1316. and now ZIPKEY, that simulate keyboard typing at computer speeds.
  1317.  
  1318.  
  1319.  
  1320. Window Characteristics
  1321.  
  1322. This section of ZIPKEY's configuration allows you to adjust the
  1323. visual characteristics of ZIPKEY's popup window.
  1324.  
  1325. ZIPKEY tries to present you with a window that is both easily
  1326. noticed and unobtrusive.  To be easily noticed, ZIPKEY pops a
  1327. window with a different color than the underlying screen (reverse
  1328. video for monochrome monitors).  To be unobtrusive, ZIPKEY avoids
  1329. popping up in a location that would cover up the current cursor
  1330. location on the screen.
  1331.  
  1332. For windows configuration, ZIPKEY simultaneously pops up two
  1333. windows.  The main window shows where ZIPKEY usually pops up.
  1334. The alternate window shows where ZIPKEY pops up if the main
  1335. window would cover the current cursor position.   You can
  1336. eliminate the alternate window (thus disabling the cursor-dodging
  1337. feature) by pressing the F5 key, which toggles the alternate
  1338. window on and off.  You'll need to disable the alternate window
  1339. if you want the main window to pop up in the middle of the
  1340. screen, where there isn't room on either side for an alternate
  1341. window.  You can swap the main and alternate windows by pressing
  1342. the F6 key.
  1343.  
  1344. During this configuration window display, you can use the arrow
  1345. keys (Up, Down, Left, or Right) to move the main window.  You
  1346. cannot move the alternate window directly, but you can
  1347. temporarily swap the main and alternate windows with F6, move the
  1348. temporarily-main window, and then reswap with F6 again.
  1349.                                                               3-6
  1350.  
  1351. The remaining function keys are used to adjust the colors for the
  1352. popup window.  The internal numeric codes for the colors are
  1353. displayed, so that you can manually record the settings if you
  1354. wish.  There are two function keys for each setting: one to
  1355. decrement the numeric code, the other to increment the code.  F1
  1356. and F2 change the window color (sometimes called the "background"
  1357. color) usually displayed.  F3 and F4 change the text
  1358. ("foreground") color.  If most of the underlying screen (actually
  1359. a diagonal sample of cells, to save time) is the same background
  1360. color as the window's main color, then ZIPKEY uses the alternate
  1361. color, displayed on only four lines of the main configuration
  1362. window.  The alternate window color is adjusted by F7 and F8; the
  1363. text color by F9 and F10.
  1364.  
  1365. When you have completed adjusting the windows to your taste, you
  1366. press the Enter key to pop away the configuration windows, and
  1367. move on to the next stage of configuration.
  1368.  
  1369.  
  1370. Monochrome and Color Window Settings
  1371.  
  1372. If you are installing ZIPKEY on multiple computers, some with
  1373. monochrome screens and others with color screens, then you should
  1374. create your ZC file on one type of screen, and modify it for
  1375. window colors on another computer with the other type of screen.
  1376. ZIPKEY stores separate color codes for monochrome and color
  1377. screens.  When it is installed, ZIPKEY detects whether you have
  1378. color or monochrome.  If you have a color screen, ZIPKEY uses the
  1379. selections you configured on a color screen; if you have a
  1380. monochrome screen, ZIPKEY uses the other selections you made on
  1381. monochrome.  Thus, you don't need to have a different ZC file for
  1382. your monochrome vs. color computers.
  1383.  
  1384.  
  1385. Hotkey Configuration
  1386.  
  1387. All of the options described up to now are global settings-- they
  1388. determine the overall characteristics of ZIPKEY, that don't
  1389. depend on which hotkey was pressed to invoke ZIPKEY.  Now we'll
  1390. discuss the characteristics specific to hotkeys -- they change
  1391. depending on the keystroke combination used to invoke ZIPKEY.
  1392.  
  1393. We recall the example spelled out in the section "Determining
  1394. Your Configuration Needs" earlier in this chapter.  In that
  1395. example, you will invoke ZIPKEY in two different contexts: from
  1396. within a database manager, and also from within a word processor.
  1397. The format for typing city/state/zipcode differs in the two
  1398. contexts.  In the following sections, we'll present one method of
  1399. handling the difference: we'll define two different hotkey
  1400. combinations to invoke ZIPKEY.  One hotkey is to be used while in
  1401. the database manager, and the other hotkey is to be used while in
  1402. the word processor.  Later, we'll talk about other ways to handle
  1403. the difference (with alternate exit keys, or with alternate named
  1404. ZC files).
  1405.                                                               3-7
  1406.  
  1407. Hotkey Name
  1408.  
  1409. The first part of a hotkey specification is its name-- the
  1410. combination of keystrokes you will use to invoke ZIPKEY.  To
  1411. detect hotkeys, ZIPKEY monitors the signals coming directly from
  1412. the keyboard into your computer, so that ZIPKEY can tell when you
  1413. have pressed keys simultaneously.  You should select some
  1414. combination of keys that won't be pressed for any purpose other
  1415. than invoking ZIPKEY.  Often you won't need a combination: you
  1416. might find some individual keys on your keyboard that are
  1417. otherwise unused.  Here are some ideas for hotkeys you can use:
  1418.  
  1419. 1. We've already mentioned the 5 key on the numeric keypad.  Of
  1420.    course, you should only choose this if you habitually keep
  1421.    Numlock off.  Otherwise, you wouldn't be able to use the
  1422.    keypad to type any numbers containing the digit 5.
  1423.  
  1424. 2. Other individual keys that are seldom used are the F11 and F12
  1425.    keys on the newer-generation keyboards, and the SysReq key on
  1426.    the AT keyboard.
  1427.  
  1428. 3. If the computer using ZIPKEY is dedicated to a single purpose,
  1429.    such as order entry, you might have a printing key on your
  1430.    keyboard, such as the back-quote key, that is almost never
  1431.    used.  You can make this key a ZIPKEY hotkey without causing
  1432.    too much inconvenience.  If you do so, you may wish to define
  1433.    Alt-backquote as a special hotkey that produces a back-quote
  1434.    (how to do this is discussed later).
  1435.  
  1436. 4. Exotic combinations of the shifting keys (Shift, Ctrl, Alt),
  1437.    possibly combined with a single non-shifting key, are often
  1438.    used as hotkeys to invoke memory-resident programs.  Examples:
  1439.    Ctrl-RightShift, both Shift keys, Ctrl-Shift-Z, or both Shift
  1440.    keys and Z.  A couple of cautions are in order here: First, if
  1441.    there are other memory-resident programs residing
  1442.    simultaneously with ZIPKEY, you must insure that every
  1443.    programs' hotkeys can be detected by that program.  For
  1444.    example, Ctrl-Alt-Z wouldn't be a good ZIPKEY hotkey if you
  1445.    have Sidekick, because Sidekick would pop in when it saw the
  1446.    Ctrl-Alt.  Second, you should be aware that ZIPKEY
  1447.    distinguishes between left and right shifting keys.  If you
  1448.    don't want ZIPKEY to distinguish, you can define identical
  1449.    hotkeys with each combination.
  1450.                                                               3-8
  1451.  
  1452. 5. If you've used up all the obvious sequences, ZIPKEY allows
  1453.    combinations not usually seen in hotkeys; namely, you can have
  1454.    more than one non-shifting key.  A mnemonic choice would be
  1455.    the Z and C keys pressed simultaneously-- they're close
  1456.    together but not adjacent so the combination won't be pressed
  1457.    accidentally.  This hotkey requires an extra consideration:
  1458.    from the computer's point of view, the keys will never be
  1459.    simultaneous: one code will always be received before the
  1460.    other.  ZIPKEY doesn't care which key comes first, as long as
  1461.    the second key is pressed before the first one is released.
  1462.    But before ZIPKEY can pop up, one of the two keycodes will be
  1463.    seen by the program (e.g. the database manager or word
  1464.    processor) that you're running.  So an unwanted Z or C will be
  1465.    displayed. You handle this in your returned city/state/zip
  1466.    keystroke sequence, by specifying the first returned keystroke
  1467.    to be the backspace key, wiping out the Z or C.
  1468.  
  1469.    Another caution is in order for the most exotic sequences:
  1470.    some keyboards get confused by more than two non-shifting keys
  1471.    pressed simultaneously, and don't deliver all the codes to the
  1472.    computer for ZIPKEY to see. ZIPKEY lets you verify that your
  1473.    sequence is being received correctly, by echoing the sequence
  1474.    for confirmation.  You can experiment with various
  1475.    combinations to see what works, before confirming the name for
  1476.    your hotkey.
  1477.  
  1478. The echoing of your hotkey is based on the internal codes
  1479. delivered by the IBM-PC and 100%-compatible keyboards.   Most
  1480. keyboards are compatible with the IBM-PC, but some aren't.  For
  1481. those keyboards, the echoed names won't match the names of the
  1482. keys as you know them.  However, as long as the echoing is
  1483. consistent (you get the same thing on several tries), the hotkey
  1484. will work correctly when you use ZIPKEY.
  1485.  
  1486. Recalling our database/word processing example: let's assume you
  1487. have a newer-generation keyboard with F11 and F12 keys.  You'll
  1488. use F11 for the database hotkey and F12 for the word processing
  1489. hotkey.  So the first time you are prompted for a hotkey name,
  1490. type the F11 key for the name, and Y to confirm the name.
  1491.  
  1492.  
  1493. Zipcode Source
  1494.  
  1495. Once you have confirmed the name of a hotkey, ZIPKEY next asks
  1496. for the first action it should take when you have pressed the
  1497. hotkey.  There are four choices: first, ZIPKEY can simply pop up
  1498. its window and wait for the operator to type a zipcode
  1499. specification.  Second, ZIPKEY can look at the contents of the
  1500. video display, to find a zipcode that already appears on the
  1501. screen.  Third, ZIPKEY can pretend that it has popped up its
  1502. window and that a fixed sequence of zipcode specification
  1503. keystrokes has already been typed. Finally, ZIPKEY can look at
  1504. the last 16 keystrokes typed, and use the last 5 digits typed as
  1505. the zipcode to be searched.  Let's consider each choice in turn:
  1506.                                                               3-9
  1507.  
  1508. 1. The popup-window option is the simplest and most
  1509.    commonly-used.  There are no further configuration choices you
  1510.    need to make for this option.
  1511.  
  1512. 2. The video screen option is used when the zipcode has already
  1513.    been typed at the time ZIPKEY is invoked.  You can use this
  1514.    option to create a hotkey that verifies existing address
  1515.    records, or to create a data-entry scenario in which ZIPKEY's
  1516.    window normally doesn't pop up at all, and so is the most
  1517.    unobtrusive.
  1518.  
  1519.    If you choose to take the zipcode from the video screen,
  1520.    ZIPKEY will look for five consecutive digits on the same line
  1521.    as the cursor, or on an immediately adjacent line, above or
  1522.    below the current line.  If no five-digit sequence is seen,
  1523.    ZIPKEY will pop up a window just as if option 1 had been
  1524.    selected.  If a five-digit sequence is seen but it isn't a
  1525.    valid zipcode, ZIPKEY will pop up its window with that
  1526.    zipcode, and tell you that the city wasn't found.  For the
  1527.    final possibility, a valid five-digit zipcode, you have an
  1528.    option: you can have ZIPKEY pop up its window so that you can
  1529.    confirm the city, or you can have ZIPKEY automatically play
  1530.    back the city/state/zip sequence without popping up at all.
  1531.    If you want to allow the possibility of using alternate exit
  1532.    keys (described later), you must choose to have ZIPKEY always
  1533.    pop up the window.
  1534.  
  1535.    What happens if there is more than one five-digit sequence on
  1536.    the screen? ZIPKEY uses the first sequence it finds, searching
  1537.    in the following order: first, it starts five characters
  1538.    beyond the current cursor position, looking backwards to the
  1539.    start of the current line.  Then it looks from the current
  1540.    cursor position forwards to the end of the current line.  Then
  1541.    it looks backwards from the end to the start of the line above
  1542.    the current cursor position.  Finally, it looks from the start
  1543.    to the end of the line below the current cursor position.
  1544.  
  1545. 3. The fixed-keystroke option is used for a number of
  1546.    special-purpose applications.  For example, if a large number
  1547.    of addresses that you type are in a local area in which the
  1548.    first three zipcode digits are always the same, you may wish
  1549.    to define a hotkey with a fixed-keystroke sequence consisting
  1550.    of those three digits.  Or, if your data-entry scenario
  1551.    includes typing the zipcode twice (as a part of an ID number,
  1552.    then later as a part of the address), you may wish to define
  1553.    an option 1 (popup) hotkey for the first instance of the
  1554.    zipcode, then another, option 3 hotkey for the second
  1555.    instance, with a fixed-keystroke string of "{Enter} to repeat
  1556.    the zipcode.  Finally, you can use this option to make hotkeys
  1557.    to generate keystroke sequences having nothing to do with
  1558.    zipcodes.  To do this, you again use "{Enter} as the fixed
  1559.    input sequence, so that the ZIPKEY window doesn't pop up.
  1560.    Then you specify a playback sequence that doesn't use any of
  1561.    the zipcode entries -- I'll give an example at the end of this
  1562.    chapter.
  1563.  
  1564.                                                              3-10
  1565.  
  1566.    When you choose this option, ZIPKEY prompts you for the fixed
  1567.    keystroke sequence.  Remember, this is a sequence of keys that
  1568.    you could have typed if ZIPKEY's window had popped up.  Thus,
  1569.    it should follow ZIPKEY's popup syntax: either a sequence of
  1570.    digits for a zipcode, or a two-letter state code followed
  1571.    optionally by a (partial or complete) city name, or a
  1572.    question-mark followed by a city name, or the double-quotes
  1573.    mark " to repeat the last zipcode.
  1574.  
  1575.    Note that the Enter key can be included in the keystroke
  1576.    sequence.  Thus you must use another key to tell ZIPKEY right
  1577.    now that you've finished typing the keystroke sequence.  I
  1578.    have chosen the * character as the signal for this, as it
  1579.    isn't a part of ZIPKEY's popup syntax.
  1580.  
  1581.    A common mistake is to confuse this fixed keystroke sequence
  1582.    with the sequence of keys intended to be played back through
  1583.    your keyboard.  If, for example, you provide Bloomington, IN
  1584.    47401* here, ZIPKEY will pretend you had typed BLOO etc. when
  1585.    its window popped up.  It will try to find a state whose name
  1586.    begins with B, tell you there isn't any, and discard the rest
  1587.    of the sequence.  You should instead provide the simpler fixed
  1588.    sequence 47401{Enter}* and give a playback sequence (described
  1589.    shortly) that causes the desired fixed city/state/zip
  1590.    combination.
  1591.  
  1592. 4. The last-keystrokes option is the only one you can use if you
  1593.    wish to type in zipcodes from within graphics programs such as
  1594.    Borland Reflex or Ventura Desktop Publisher.  ZIPKEY cannot
  1595.    pop up when your video display is in graphics mode; nor can it
  1596.    read the contents of the screen.  With this option, you type
  1597.    the zipcode first, before pressing the ZIPKEY hotkey.
  1598.  
  1599. In the database management example, you'll choose option 1, to
  1600. pop up a window and wait for the operator to type in the zipcode.
  1601.  
  1602.  
  1603. Format of City/State/Zip Keystrokes
  1604.  
  1605. In normal ZIPKEY usage, after the zipcode has been specified and
  1606. the Enter key is typed to confirm the city found, ZIPKEY will
  1607. fool the computer into thinking a complete city/state/zip
  1608. combination has been typed.  You specify the format for this
  1609. combination now, during the specification of your hotkey.
  1610.  
  1611. The sequence usually consists of variable parts (city, state,
  1612. zip) that depend on the zipcode, combined with fixed parts: the
  1613. keystrokes that separate the variable parts, such as spaces,
  1614. punctuation marks, and positioning keys.  As you specify the
  1615. sequence, you type most of the fixed parts (spaces, commas,
  1616. Enter, Tab, arrow keys, etc.) just as you want them played back.
  1617. For each variable part, you substitute a letter (which you can
  1618. type in either upper- or lower-case) from the following list:
  1619.                                                              3-11
  1620.  
  1621. C  causes the name of the city to be generated.  ZIPKEY will
  1622.    abbreviate the name as necessary to fit it into a fixed-sized
  1623.    field.  When you type the C now at configuration time, a
  1624.    window pops up, prompting you to follow the C with the
  1625.    two-digit width you would like the city to fit into. You
  1626.    should type 99 if there is no limit.  A limit of 15 will give
  1627.    you reasonable results in all cases.  A limit less than 15
  1628.    will make some entries undecipherable and/or ambiguous.  A
  1629.    limit of 19 will cause all but a few cities not to be
  1630.    abbreviated at all.  The longest city name in the database is
  1631.    King and Queen Court House (Virginia), which has 26
  1632.    characters.
  1633.  
  1634.    If you type a limit less than 99, ZIPKEY will then ask you to
  1635.    specify whether the playback should follow the city name with
  1636.    a sequence of spaces (or right-arrows, or whatever) to fill
  1637.    out the fixed field.  Most database managers (including the
  1638.    one in our example) won't require this -- they let you type a
  1639.    single key, such as Enter or Tab, to advance to the next
  1640.    field. You would typically need this padding only if you are
  1641.    using a simple text editor to maintain a fixed-field database.
  1642.    If you need the padding, type F followed by the padding
  1643.    character (typically the space bar).  If you don't need the
  1644.    padding, type N and continue the playback sequence by
  1645.    providing the character needed (Enter, Tab, etc.) to advance
  1646.    beyond the city field.
  1647.  
  1648. A  causes the two-letter state abbreviation (in capital letters)
  1649.    to be generated.
  1650.  
  1651. Z  causes the five-digit zipcode to be generated.  There is one
  1652.    case -- a city search which returned multiple zipcodes in
  1653.    which the operator didn't complete the zipcode -- that x's are
  1654.    provided to complete the zipcode.
  1655.  
  1656. In addition to the above commonly-used letters, ZIPKEY offers the
  1657. following letters for more special purposes:
  1658.  
  1659. B  causes a backspace to be generated.  This is on this list so
  1660.    you can use the backspace key right now to correct your
  1661.    configuration entry.  You will begin your playback sequence
  1662.    with B if the hotkey name was something like Z C, which causes
  1663.    one letter to escape to the application program.  You can also
  1664.    begin the playback sequence with BBBBB if you used option 2 or
  1665.    option 4 above to read a just-typed zipcode, and you wish to
  1666.    replace the zip with city/state/zip in the playback sequence.
  1667.  
  1668. L  causes the next character to be literalized -- that is, it is
  1669.    output as-is even though it might be on this list.  You can
  1670.    and should literalize all letters played back, just in case
  1671.    future versions of ZIPKEY add new letters to this list.  You
  1672.    can also literalize the * character to cause it to be played
  1673.    back instead of being interpreted as the terminator to this
  1674.    sequence.  For example, you may wish to embellish our
  1675.    word-processing example by appending LDLeLaLr followed by a
  1676.    space to the playback, causing "Dear " to be generated below
  1677.    the letterhead.
  1678.                                                              3-12
  1679.  
  1680. R  is used to retreat back across a variable-length city name.
  1681.    This would be used in a special case in which an address is
  1682.    being generated that might be indented on the page by an
  1683.    unknown amount.  Some text editors might require you to
  1684.    left-arrow back to the start of the name, then down-arrow to
  1685.    the next line to be aligned with the city-line.  You follow
  1686.    the R with the left-arrow key, or whatever other key you wish
  1687.    to be repeated by the length of the city name.
  1688.  
  1689. S  causes the full name of the state to be generated.  Most
  1690.    people will not use S, but instead use A to generate the
  1691.    two-letter abbreviation.
  1692.  
  1693. Just as with the fixed input specification, you can include the
  1694. Enter key as part of the sequence of keystrokes.  So you signal
  1695. ZIPKEY that the sequence is complete with the * character.
  1696.  
  1697. Returning to our database example, recall that the keystroke
  1698. sequence used for entering the city/state/zip combination was
  1699.  
  1700. {Enter}C{Enter}AZ{Enter}
  1701.  
  1702. This is what you should type when ZIPKEY asks for the keystroke
  1703. playback sequence.  When you type C, ZIPKEY asks for the maximum
  1704. city width-- you should give the field width 17.  Then ZIPKEY
  1705. tells you to type F if you need padding, and N if you don't.  You
  1706. don't need padding, so you type N.  The complete specification
  1707. you type, including the terminating *, is
  1708.  
  1709. {Enter}C17N{Enter}AZ{Enter}*
  1710.  
  1711.  
  1712. Multiple Hotkeys
  1713.  
  1714. As a more advanced option, ZIPKEY allows you to define multiple
  1715. hotkeys.  (The limit is 99, which I hope is much more than anyone
  1716. will ever need.)  When you are setting up a new configuration
  1717. file, ZIPKEY will invite you to define another hotkey after the
  1718. first hotkey specification is complete.  You may also add hotkeys
  1719. at any point later in time, by selecting the appropriate option
  1720. in the configuration editing menu.
  1721.  
  1722. In our example, you answer Y to the invitation to define another
  1723. hotkey, and name the second hotkey F12.  You again choose zipcode
  1724. source option 1, to pop up the window and wait for keyboard
  1725. input.  The keystroke return sequence for word processing,
  1726. including the 99 for unlimited width and the terminating *, is
  1727.  
  1728. C99, A Z{Enter}{Enter}*
  1729.                                                              3-13
  1730.  
  1731. Exit Keys
  1732.  
  1733. Here is another option for more advanced users.  We've just seen
  1734. that one way to specify different keystroke playback sequences is
  1735. to define a different hotkey for each sequence.  Another way is
  1736. to define one or more alternate ZIPKEY exit keys.
  1737.  
  1738. The normal method for confirming a zipcode and initiating key
  1739. playback is the Enter key.  If you have defined an alternate exit
  1740. key, you can press that alternate key instead of Enter to confirm
  1741. a zipcode.  The keystroke playback sequence is associated with
  1742. the exit key, and so remains the same no matter what hotkey was
  1743. used to invoke ZIPKEY.
  1744.  
  1745. Since the function keys (F1, F2, etc.) have no other meaning at
  1746. the moment you are about to exit the ZIPKEY window, they are good
  1747. choices for alternate exit keys.  Let's consider our
  1748. database-and-word processing example.  Suppose you don't have a
  1749. new-generation keyboard with F11 and F12 keys, and you don't like
  1750. exotic keystroke combinations.  So you wish to define only one
  1751. hotkey, numeric 5.  You decide that most addresses will be typed
  1752. in through the database manager, so you specify the database
  1753. return sequence {Enter}C17N{Enter}AZ{Enter}{Enter}* for the
  1754. hotkey.  It will be played back whenever the Enter key is used to
  1755. confirm a zipcode.  For word processing, you define an alternate
  1756. exit key F1, and specify the word-processing sequence C99,  A
  1757. Z{Enter}{Enter}* as the playback sequence for F1.  Then, whenever
  1758. an address is being typed to the word processor, it is confirmed
  1759. with F1 instead of Enter, to get the alternate playback.
  1760.  
  1761. You can, of course, have both multiple hotkeys and alternate exit
  1762. keys. This would be desirable, for example, if you wanted to have
  1763. a number of different input combinations (e.g. popup a window
  1764. immediately, take the zipcode from the screen, and several
  1765. different fixed keystroke combinations for different localities),
  1766. combined with a number of different playback sequences.  You
  1767. would define a different hotkey for each input possibility, and
  1768. an alternate exit key for each playback sequence (except the most
  1769. commonly-used sequence, which you specify for every hotkey as the
  1770. sequence used when Enter is pressed to confirm an entry).
  1771.  
  1772.  
  1773. Configuration Editing Menu
  1774.  
  1775. After your configuration specification is complete, ZIPKEY goes
  1776. to the configuration editing menu.  This menu allows you to
  1777. display and/or modify the configuration choices you have made.
  1778. There are display options for the global settings (memory,
  1779. intermediate results, numlock, slow keyboard, and all the window
  1780. settings), the hotkey names, and the exit key names and playback
  1781. sequences.  There are also corresponding modification choices,
  1782. that return you to the appropriate sections of the original
  1783. configuration process.  Again, the default values for the global
  1784. settings are the values you chose before -- if you wish to change
  1785. just a single global setting, choose "Global modify" and then
  1786. just keep pressing Enter until that setting comes up.
  1787.                                                              3-14
  1788.  
  1789. Option 7 of the configuration menu allows you to generate your
  1790. own quick reference card. I do not provide a printed
  1791. quick-reference card as a part of the ZIPKEY software package,
  1792. because much of the useful information contained on that card is
  1793. specific to your configuration.  Instead, this option prepares a
  1794. quick-reference document containing the configuration
  1795. information, that you can print out yourself.  The file is
  1796. written as ZIPKEY.ZQR (ZQR stands for Zipkey Quick Reference) on
  1797. your current disk directory.  You may wish to edit the document
  1798. for formatting before printing it; or you can simply type to the
  1799. DOS prompt the command COPY ZIPKEY.ZQR PRN.
  1800.  
  1801.  
  1802. Named Configuration Files
  1803.  
  1804. The final action in the configuration process is to save the ZC
  1805. (Zipkey Configuration) file to your disk, so that ZIPKEY can read
  1806. it every time you install ZIPKEY in memory.  If you will have
  1807. only one configuration, you should use the default file name,
  1808. ZIPKEY.ZC.
  1809.  
  1810. You may, however, wish to have different configurations, either
  1811. for different users or for different computing contexts.  In our
  1812. example, this would be a third way to provide a different
  1813. playback sequence for the database manager vs. word processor
  1814. case.  You could configure a single hotkey for the database, and
  1815. name its ZC file DATA.ZC.  Then you could make another
  1816. configuration, named WORD.ZC, with a single hotkey for the word
  1817. processor. Before entering the database manager, you always load
  1818. ZIPKEY using DATA.ZC; before entering the word processor, you
  1819. load ZIPKEY using WORD.ZC.
  1820.  
  1821. When ZIPKEY asks you for the name of the configuration file, you
  1822. do not need to type the file-name extension .ZC, but you can if
  1823. you want.  Any extension other than .ZC will be ignored, and .ZC
  1824. will be used.
  1825.  
  1826. The ZQR file produced by the quick reference document generation
  1827. option is always named after the ZC file.  For example, the ZQR
  1828. file for DATA.ZC is DATA.ZQR.
  1829.  
  1830.  
  1831. Modifying Configuration Files
  1832.  
  1833. You may modify a configuration file at any time, by selecting
  1834. option 3 from the main menu, or by invoking ZIPKEY 3 from the DOS
  1835. command prompt.  You may also include the name of the ZC file in
  1836. the DOS command prompt.  For example, ZIPKEY 3 DATA will cause
  1837. ZIPKEY to look for DATA.ZC.
  1838.  
  1839. If the ZC file you wish to modify is not found, ZIPKEY asks if
  1840. you are configuring it for the first time, giving you the chance
  1841. to change the file name in case you mistyped it.  Conversely,
  1842. you're also given options if the file was found, in case you
  1843. thought you were configuring for the first time.
  1844.                                                              3-15
  1845.  
  1846. The default choice in the configuration editing menu tells you if
  1847. you have made any modifications to the file.  If it is 9 (abort,
  1848. exiting without saving), you haven't modified the file.  If it is
  1849. 8 (disk save), you have.
  1850.  
  1851.  
  1852. More Hotkey Examples
  1853.  
  1854. Here are the complete configuration specifications for a few of
  1855. the scenarios mentioned earlier in this chapter.  To work the
  1856. examples in this section, type ZIPKEY 3, then either walk through
  1857. a configuration process until you get to the "Hotkey name"
  1858. prompt, or select option 4, "Hotkey review, modify, add or
  1859. delete", of the configuration editing menu.
  1860.  
  1861. First, let's configure so that the zipcode comes from the screen,
  1862. and the ZIPKEY window doesn't pop up at all if the zipcode is
  1863. found.  When prompted for the hotkey name, press the back-quote
  1864. key.  Select option 2, "From the zipcode near the current cursor
  1865. position on the screen."  Then type N, you don't want the screen
  1866. to pop up for confirmation if the zipcode is found.  For the
  1867. playback sequence, we'll assume that you want to erase the
  1868. just-typed zipcode and replace it with a letterhead: type
  1869.  
  1870. BBBBBC99, A Z{Enter}
  1871.  
  1872. and terminate with the * key.
  1873.  
  1874. Because we used a displaying key (the backquote key) as the
  1875. hotkey in the previous example, let's define another hotkey that
  1876. generates a backquote.  When prompted for the hotkey name, type
  1877. Alt-backquote.  Select option 3, fixed string, for the zipcode
  1878. source.  ZIPKEY then asks for the fixed specification, and you
  1879. type the double-quotes key " followed by {Enter} and the
  1880. terminating * key.  Your keystroke playback sequence then has
  1881. nothing to do with zipcodes: it is simply the backquote key
  1882. followed by the terminating * key.  Now if you need to generate a
  1883. back-quote, you can type Alt-backquote.
  1884.  
  1885. Next, let's handle the case in which a zipcode is typed twice:
  1886. once as a part of an identification code, and then later as a
  1887. part of the address.  When prompted for the hotkey name, type the
  1888. Z and the 1 keys simultaneously.  For the zipcode source, choose
  1889. option 1, "The operator types it in after the window is popped
  1890. up."  Since you used two non-shifting keys, one of the keys will
  1891. have been fed to your application program: you now wipe it out by
  1892. beginning the playback sequence with B.  Since the city and state
  1893. name aren't part of the identification code, the playback is just
  1894. the backspace and the zipcode: BZ followed by the terminating *
  1895. key.  Next you specify a second hotkey, named with the Z and 2
  1896. keys.  Since you are repeating the zipcode just looked up for the
  1897. identification code, you specify option 3, fixed string, as the
  1898. zipcode source.  ZIPKEY then asks for the fixed specification,
  1899. and you again type the double-quotes key " followed by {Enter}
  1900. and the terminating * key.  Then you type the keystroke playback
  1901. sequence: C17N{Enter}AZ{Enter} followed by the terminating * key.
  1902.                                                              3-16
  1903.  
  1904. Finally, let's do an example in which we provide a fixed field on
  1905. a simple text editor.  The city field will be 19 characters wide,
  1906. starting at column 33 on a line, which is the fourth tab stop.
  1907. It will be followed by the state abbreviation and the zipcode.
  1908. For the hotkey name, press both Shift keys, then press the Z key.
  1909. Choose option 1 as the zipcode source.  For the playback
  1910. sequence, we assume that the Home key will put the cursor at the
  1911. start of the current line, so you can specify
  1912.  
  1913.    {Home}{Tab}{Tab}{Tab}{Tab}C19F A Z*
  1914.  
  1915. which will leave the cursor just beyond the zipcode.
  1916.  
  1917.  
  1918. Conclusion
  1919.  
  1920. This concludes the description of ZIPKEY configuration.  In the
  1921. next chapter we'll discuss how to arrange the ZC file together
  1922. with the other ZIPKEY files, so that ZIPKEY is permanently
  1923. available to you.
  1924.  
  1925. As you have seen, ZIPKEY has a wide array of options.  There is
  1926. often more than one method of handling a given configuration
  1927. requirement.  Which method you choose is often simply a matter of
  1928. personal taste.  If you are intimidated by the choices, then keep
  1929. things simple to start out with.  Like any complex program,
  1930. ZIPKEY will serve you best if you let yourself become familiar
  1931. with it before trying to exploit every feature.
  1932.  
  1933. CHAPTER 4   RUNNING MEMORY-RESIDENT ZIPKEY
  1934.  
  1935.  
  1936. This chapter assumes you have some familiarity with DOS concepts
  1937. and commands-- for example, it assumes you know what a
  1938. subdirectory is, and how to copy a file to a subdirectory.  If
  1939. you aren't very familiar with DOS (you run straight to your
  1940. word-processor and stay there when you turn your computer on),
  1941. you may need to have a DOS-knowledgeable person assist you.
  1942.  
  1943.  
  1944. Installing ZIPKEY as a Memory-Resident Program
  1945.  
  1946. In Chapter 3 we discussed how to create a ZC file to configure
  1947. ZIPKEY to your specific needs.  Once you have done so, you are
  1948. ready to run ZIPKEY as a memory-resident program.  You do so by
  1949. selecting option 4 of the ZIPKEY main menu.  You can also do so
  1950. directly from the DOS command prompt, by issuing the command
  1951.  
  1952.       ZIPKEY 4
  1953.  
  1954. followed by the Enter key.  If you have a ZC file named something
  1955. other than ZIPKEY, you include the ZC file name on the command
  1956. line.  For example, if you have a ZC file named DATA, either of
  1957. the following command lines will load ZIPKEY as a memory resident
  1958. program, using the configuration file DATA.ZC:
  1959.  
  1960.    ZIPKEY 4 DATA
  1961.    ZIPKEY DATA 4
  1962.  
  1963. The process of loading ZIPKEY as a memory-resident program causes
  1964. your computer to exit the ZIPKEY program, and return you to the
  1965. DOS command prompt.  You are now ready to run any other programs
  1966. you choose, but ZIPKEY is still in your computer's memory, ready
  1967. to be activated at any time by the hotkey or hotkeys you chose
  1968. when you configured ZIPKEY as described in Chapter 3.
  1969.  
  1970. As an example, let's assume you have defined a ZC file with the
  1971. two hotkeys we discussed in Chapter 3: one, F11, for use within
  1972. your database manager, and the other, F12, for use within your
  1973. word processor.  Having loaded ZIPKEY as a memory-resident
  1974. program, you can now enter either your database manager or your
  1975. word processor to see if ZIPKEY works.  You reenter your database
  1976. manager, just as you did before you configured ZIPKEY, to type in
  1977. a sample address.  Just as before, the database manager puts an
  1978. address template onto the screen.  You type in a sample name and
  1979. street address; but instead of typing the Enter that will advance
  1980. you to the city field, you type the F11 hotkey instead.  The
  1981. ZIPKEY window pops onto the screen, inviting you to type a
  1982. zipcode specification.  (If it doesn't, see the section "ZIPKEY
  1983. and Other Memory-Resident Programs", later in this chapter.)  You
  1984. may type any specification as described in Chapter 2.
  1985.                                                               4-2
  1986.  
  1987. For most business applications, you will already have the zipcode
  1988. available to you, and you will be using ZIPKEY to make the data
  1989. entry faster and more accurate.  You type in a zipcode, 31625,
  1990. and get the city Barney, GA for confirmation.  You confirm with
  1991. the Enter key.  Now, if you defined your keystroke playback
  1992. sequence to duplicate what you would have typed to your database,
  1993. you should see the city, state, and zip fields of your address
  1994. template filled with the correct values.
  1995.  
  1996. What do you do if the template is not filled correctly?  You need
  1997. to determine if you got the keystroke playback sequence right.
  1998. If the city/state/zip appears to be there but is in the wrong
  1999. fields, then it's likely that you got your cursor-positioning
  2000. keys wrong -- either too many or not enough.  You should repeat
  2001. the exact keystroke sequence used to enter city/state/zip, and
  2002. make sure that is the sequence specified to ZIPKEY's
  2003. configuration.  You can get a listing of what you specified by
  2004. printing out the ZQR (Zipkey Quick Reference) file that you can
  2005. create via option 7 of the ZIPKEY configuration editing menu.
  2006. For example, if you created ZIPKEY.ZQR, type the command
  2007.  
  2008.    COPY ZIPKEY.ZQR PRN
  2009.  
  2010. to the DOS command prompt, and the listing will be sent to your
  2011. printer.
  2012.  
  2013. If ZIPKEY appears to be playing back only every second or third
  2014. letter of the city/state/zip, then your program needs the
  2015. keyboard slowdown option, one of the global settings of the
  2016. configuration.
  2017.  
  2018. In any case, if a configuration change needs to be made, follow
  2019. the instructions in the next section to reinstall a new
  2020. configuration.
  2021.  
  2022. Having checked out the database manager, you need to move on to
  2023. the word processor.  You exit the database and invoke the word
  2024. processor.  You type a sample name and street address.  Instead
  2025. of typing a city name, you press the F12 key, and the ZIPKEY
  2026. window pops up once again.  Now type 23054 to get the entry Fife,
  2027. VA.  When you press the confirming Enter key, the complete
  2028. specification Fife, VA 23054 appears, the cursor is positioned at
  2029. the second line below.  Again, if you didn't get the right
  2030. results, you need to figure out whether you got the playback
  2031. sequence right.
  2032.  
  2033.  
  2034. Correcting Your Configuration
  2035.  
  2036. If your check-out of memory-resident ZIPKEY revealed some changes
  2037. you need to make in the configuration, you may do so by typing
  2038.  
  2039.    ZIPKEY 3
  2040.                                                               4-3
  2041.  
  2042. followed by the ZC file name if it isn't ZIPKEY, to the DOS
  2043. command prompt.  You should then be told by ZIPKEY that the
  2044. configuration file already exists, at which point you choose
  2045. option 3, to go to the configuration editing menu to modify it.
  2046.  
  2047. The option "Global modify" followed by several presses of the
  2048. Enter key will get you to the "Slow down keyboard" option, which
  2049. you can change to Y if your program was missing regularly-spaced
  2050. keystrokes.  You may wish to temporarily slow down the keyboard
  2051. even if this wasn't the problem, so that you can more easily
  2052. watch the playback to diagnose how you got the sequence wrong.
  2053.  
  2054. The option "Hotkey review, modify, add or delete" will change the
  2055. keystroke playback sequence for a specific hotkey.  You need to
  2056. repeat the specification sequence, giving the hotkey name,
  2057. zipcode source, and the corrected playback sequence.
  2058.  
  2059. When you have made your changes, you can type Enter to the ZIPKEY
  2060. configuration menu, to execute default option 8, the disk save,
  2061. which puts you back to the ZIPKEY main menu.   Press Enter again
  2062. to execute default option 4, to re-install ZIPKEY as a
  2063. memory-resident program.
  2064.  
  2065.  
  2066. Uninstalling ZIPKEY
  2067.  
  2068. You may reverse the ZIPKEY 4 command with option 7 of the main
  2069. menu, which can be executed directly from DOS with the ZIPKEY 7
  2070. command.  This option removes ZIPKEY from memory.  If there have
  2071. been no other memory-resident programs installed after ZIPKEY,
  2072. the memory occupied by ZIPKEY is freed back for your other
  2073. programs to use.  In some systems, such as those running
  2074. Sidekick, a short stub of 200-300 bytes must be retained by
  2075. ZIPKEY after uninstallation.
  2076.  
  2077.  
  2078.  
  2079. Re-installing a New Configuration
  2080.  
  2081. In most cases, you do not need to uninstall ZIPKEY in order to
  2082. reinstall a new configuration.  You can simply repeat the command
  2083. to install ZIPKEY as a memory resident program-- either option 4
  2084. from ZIPKEY's main menu, or the DOS command ZIPKEY 4 followed by
  2085. the ZC file name if it isn't ZIPKEY. You may re-install after you
  2086. have modified the ZC file already installed, or you may reinstall
  2087. to change ZC files.  ZIPKEY will detect that it was already
  2088. installed, and simply substitute the new configuration.  You'll
  2089. be back at the DOS command prompt, ready to invoke ZIPKEY within
  2090. your programs again.
  2091.  
  2092. There are only two situations in which you need to execute ZIPKEY
  2093. 7 to change configurations:
  2094.  
  2095. 1. If you change the location of ZIPKEY's database -- EMS memory
  2096.    vs. stay-on-disk vs. main memory -- this one change will be
  2097.    ignored when ZIPKEY is re-installed, and not take effect until
  2098.    after ZIPKEY is uninstalled.
  2099.                                                               4-4
  2100.  
  2101. 2. If the new ZC file is more than 256 bytes bigger than the
  2102.    first ZC file installed, ZIPKEY will tell you that the new ZC
  2103.    file is too big, and the new installation will not take
  2104.    effect.  ZC files are usually much smaller than 256 bytes, so
  2105.    unless you have unusually complicated configurations, you
  2106.    won't have this problem.  If you do, you should make sure that
  2107.    your largest ZC file is loaded first when your computer starts
  2108.    up.
  2109.  
  2110.  
  2111. Making ZIPKEY Permanently Available
  2112.  
  2113. The MS-DOS operating system has a mechanism that allows you to
  2114. specify that certain programs should be run every time your
  2115. computer is started.  You create a file called AUTOEXEC.BAT, on
  2116. the same disk drive from which the operating system is loaded.
  2117. If you have a hard disk system, this is usually drive C.
  2118. AUTOEXEC.BAT is a text file, containing lines that you might type
  2119. to the DOS command prompt to run programs.  Every time your
  2120. computer is started, MS-DOS reads the AUTOEXEC.BAT file and
  2121. pretends that the first commands you typed into your computer are
  2122. the commands in that file.  You can place a line into
  2123. AUTOEXEC.BAT, containing the command to load ZIPKEY as a
  2124. memory-resident program.  For example, if your ZC file is named
  2125. ZIPKEY, you simply place the line
  2126.  
  2127.    ZIPKEY 4
  2128.  
  2129. into your AUTOEXEC.BAT file.  If the ZC file is named DATA, you
  2130. place
  2131.  
  2132.    ZIPKEY 4 DATA
  2133.  
  2134. into AUTOEXEC.BAT.  You'll need a text editor to modify
  2135. AUTOEXEC.BAT.  Your word processor might do the job, as long as
  2136. you make sure that no word-processing control characters are
  2137. inserted -- most word processors have a "plain text" mode for
  2138. this.
  2139.  
  2140.  
  2141. ZIPKEY and Other Memory-Resident Programs
  2142.  
  2143. If you have other memory-resident programs installed at the same
  2144. time as ZIPKEY, you may need to experiment a little to determine
  2145. the best order in which to load the programs.  Memory-resident
  2146. programming is extremely tricky, and the techniques are
  2147. non-standardized and poorly documented.  A resident program must
  2148. monitor all the keyboard's signals to the computer, while passing
  2149. those signals to all the other resident programs as well.  I
  2150. believe ZIPKEY does a good job of this, passing along every
  2151. keystroke received except for its own hotkeys.  But other
  2152. memory-resident programs may not do a good job: they may prevent
  2153. certain keystrokes from being seen by ZIPKEY, so that a ZIPKEY
  2154. hotkey won't pop up ZIPKEY's window.  They may even become
  2155. extremely confused and freeze up your computer when ZIPKEY is
  2156. invoked, forcing you to shut down and restart the computer.
  2157.                                                               4-5
  2158.  
  2159. A specific example: Borland's Sidekick (the program SK) insists
  2160. that you install it after other resident programs such as ZIPKEY,
  2161. and with good reason.  You can get away with running one program
  2162. after SK that monitors keystrokes directly, but if you run two
  2163. such programs, SK locks out the first program and usually locks
  2164. out your keyboard as well.  So if you run ZIPKEY after SK, and
  2165. then run a text editor such as BRIEF or XYWrite, your computer
  2166. locks up.  If you make sure ZIPKEY appears before SK in your
  2167. AUTOEXEC.BAT file, there is no such problem.
  2168.  
  2169. A reverse example: Borland's SUPERKEY program must be run before
  2170. ZIPKEY. If you run SUPERKEY after ZIPKEY, the last keystroke you
  2171. typed to ZIPKEY's pop-up window (typically Enter) will be seen by
  2172. your program as well.
  2173.  
  2174. If ZIPKEY works in its demonstration mode (ZIPKEY 2), but not in
  2175. memory-resident mode (ZIPKEY 4), you should try ZIPKEY with all
  2176. other memory-resident programs removed.  You do this by renaming
  2177. your AUTOEXEC.BAT file to something else. For example, if your
  2178. current directory contains AUTOEXEC.BAT, you can issue the
  2179. command
  2180.  
  2181.    REN AUTOEXEC.BAT AUTOEXEC
  2182.  
  2183. to temporarily remove the .BAT extension from the file.  Then
  2184. shut down and restart your computer.  When the computer is
  2185. restarted, install ZIPKEY as a memory-resident program, and try
  2186. to invoke it with a hotkey.  If ZIPKEY now works, you know that
  2187. some other memory-resident program is interacting poorly with
  2188. ZIPKEY.  You can invoke the other memory-resident programs one at
  2189. a time, trying ZIPKEY after each one, to find the culprit. It's
  2190. possible that they will all load successfully and ZIPKEY will
  2191. still work -- in that case, you simply place the ZIPKEY
  2192. invocation at the start of the AUTOEXEC.BAT file, so it is loaded
  2193. first.
  2194.  
  2195. When you have sorted things out, don't forget to rename your
  2196. AUTOEXEC file back to AUTOEXEC.BAT.
  2197.  
  2198.  
  2199. Finding ZIPKEY Files on Your Disk
  2200.  
  2201. When you set up ZIPKEY to be permanently available, you need to
  2202. make sure that the ZIPKEY files are placed on your disk where
  2203. they can be found.  This section describes how to do so.
  2204.  
  2205. Normally, when you give the name of a disk file to your computer,
  2206. you must let the computer know where it can find the file.  If
  2207. the file is on a floppy drive, you give the letter of the drive;
  2208. for example, A:ZIPKEY.OVL.  If the file is on a hard disk drive,
  2209. you might also need to name a subdirectory on the drive; for
  2210. example, C:\DOS\ZIPKEY.OVL.  To reduce this burden, DOS maintains
  2211. a "current drive" and "current directory", which act as the
  2212. defaults if you don't give a drive letter or subdirectory.  For
  2213. example, the commands
  2214.                                                               4-6
  2215.  
  2216.     C:
  2217.     CD \DOS
  2218.  
  2219. make C the current drive and \DOS the current directory, so you
  2220. can refer to ZIPKEY.OVL instead of C:\DOS\ZIPKEY.OVL.
  2221.  
  2222. DOS's command processor adds an additional embellishment to the
  2223. current-drive-and-directory concept.  When you issue a command
  2224. such as ZIPKEY to DOS, it will look for the program file
  2225. ZIPKEY.COM first in the current directory.  If it doesn't find
  2226. ZIPKEY.COM there, it can be instructed to look in other default
  2227. directories, until ZIPKEY.COM is found.  You specify the list of
  2228. other default directories by the PATH (or SET PATH=) command,
  2229. placed into your AUTOEXEC.BAT file.  For example, your
  2230. AUTOEXEC.BAT file might contain the line
  2231.  
  2232.     PATH C:\DOS;C:\WP
  2233.  
  2234. or the equivalent line
  2235.  
  2236.     SET PATH=C:\DOS;C:\WP
  2237.  
  2238. to specify that programs may be found in the directories C:\DOS
  2239. and C:\WP as well as the current directory.
  2240.  
  2241. For convenience, ZIPKEY also recognizes the PATH command to find
  2242. its auxiliary files: ZIPKEY.OVL and the ZC file.  For example, if
  2243. your AUTOEXEC.BAT does contain the previously-mentioned PATH
  2244. specification, you may place ZIPKEY.COM, ZIPKEY.OVL, and your ZC
  2245. files into the C:\DOS subdirectory.  Just make sure that the PATH
  2246. command in your AUTOEXEC.BAT comes before your ZIPKEY command.
  2247. Then you won't have to worry about what the current directory is
  2248. when ZIPKEY is invoked.
  2249.  
  2250. Alternatively, if you want to keep ZIPKEY by itself on your disk,
  2251. you can either add ZIPKEY's subdirectory to the PATH command, or
  2252. make ZIPKEY's directory the current directory at the time ZIPKEY
  2253. is invoked, with a sequence such as
  2254.  
  2255.    CD \ZIPKEY
  2256.    ZIPKEY 4
  2257.    CD \
  2258.  
  2259. which makes \ZIPKEY the current directory, invokes ZIPKEY, and
  2260. then restores the root directory \ as the current directory.
  2261. \ZIPKEY should be a subdirectory that contains all the files
  2262. \ZIPKEY\ZIPKEY.COM, \ZIPKEY\ZIPKEY.OVL, and \ZIPKEY\*.ZC.
  2263.  
  2264. Note that you must change the current directory if the ZIPKEY
  2265. files are not in a PATH directory.  You cannot replace sequence
  2266. in the previous paragraph to
  2267.  
  2268.    ZIPKEY\ZIPKEY 4
  2269.  
  2270. because ZIPKEY won't be able to find its ZIPKEY.OVL or ZC file.
  2271.                                                               4-7
  2272.  
  2273. The only crucial factor here is the file-finding situation at the
  2274. time ZIPKEY is installed (the ZIPKEY 4 command).  After that, you
  2275. may change the current drive and/or directory to anything you
  2276. want, and ZIPKEY will always find the files it needs.  The only
  2277. exception: if you run ZIPKEY from a floppy disk and you have
  2278. configured ZIPKEY to take its data from the disk, you cannot
  2279. remove the disk containing ZIPKEY.OVL-- it must still be there so
  2280. ZIPKEY can read it.
  2281.  
  2282. When deciding whether to place ZIPKEY into a PATH directory, you
  2283. may wish to consider the ease with which you would like ZIPKEY to
  2284. be invoked for modifying and reloading configurations.  With
  2285. ZIPKEY in a PATH directory, it can be invoked at any time without
  2286. changing the current directory.  If you modify an existing ZC
  2287. file, ZIPKEY will find and rewrite the file wherever it is.  (New
  2288. ZC files are always written to the current directory.)  This is a
  2289. powerful and convenient feature.  On the other hand, if you have
  2290. untutored users on your computer for which you consider such
  2291. power too dangerous, you may deliberately place ZIPKEY in a
  2292. non-PATH directory, to make careless modifications a little more
  2293. difficult.
  2294.  
  2295.  
  2296. Installing Files on a Network
  2297.  
  2298. If you set up your system so that ZIPKEY.OVL is accessed over a
  2299. network, there is an additional optimization you can make: after
  2300. copying ZIPKEY.OVL to its permanent location, you can execute the
  2301. DOS command
  2302.  
  2303.    ATTRIB +R ZIPKEY.OVL
  2304.  
  2305. which makes ZIPKEY.OVL a read-only file.  This allows your
  2306. computer to buffer data without worrying about whether another
  2307. computer has changed the file.  The result is that access is
  2308. speeded up when the same disk sector is read consecutive times.
  2309.  
  2310. CHAPTER 5   GENERATING AN ORDER FORM
  2311.  
  2312.  
  2313. Automatic Order-Form Generation
  2314.  
  2315. Because ZIPKEY is widely available on an evaluation basis, I felt
  2316. it necessary to make it easy for people to realize that ZIPKEY
  2317. isn't free.  So ZIPKEY has a special option 5 on its main menu to
  2318. generate an order for based on your usage, disk requirements, and
  2319. method of payment.  You may also execute this option directly
  2320. from the DOS command prompt, by issuing the command
  2321.  
  2322.    ZIPKEY 5
  2323.  
  2324. followed by the Enter key.  You'll also be invited to generate an
  2325. order form when installing ZIPKEY in memory (using the ZIPKEY 4
  2326. command), in two circumstances:
  2327.  
  2328. 1. If your data is 13 or more months old, you'll be warned that
  2329.    it's out of date.  The postal service regularly makes changes
  2330.    to its zipcodes, so that you need fresh data to insure
  2331.    continued accuracy.  I'll be releasing new ZIPKEY.OVL files
  2332.    based on those changes monthly.  You are required to
  2333.    resubscribe and receive a new disk at least once a year; and
  2334.    you can elect to receive disks more often if you wish.
  2335.  
  2336. 2. If you are running the evaluation version of ZIPKEY, and it is
  2337.    now the second month or later following the first creation of
  2338.    your ZC file, you'll be reminded that your evaluation period
  2339.    has expired, and invited to fill out an order form.
  2340.  
  2341. In either case, if you choose Y to the order-form invitation, you
  2342. will initiate the interactive session described in this chapter,
  2343. after which ZIPKEY will install itself as intended, and
  2344. AUTOEXEC.BAT (if that's where ZIPKEY was invoked from) will
  2345. complete itself.
  2346.  
  2347. If you press N to the invitation, the order-form procedure is
  2348. skipped, and the computer continues normally, installing ZIPKEY
  2349. which will work just fine.  I'm not going to beat you over the
  2350. head with a club; I'm trusting that you'll answer Y eventually.
  2351.  
  2352.  
  2353. ZIPKEY's Schedule of Prices
  2354.  
  2355. The pricing scheme for ZIPKEY is a little unusual in that it
  2356. involves the maximum, not the sum, of two fees.  The basic,
  2357. single-keyboard registration is $30, which buys you a printed
  2358. manual, a disk, and a year's license to run ZIPKEY in
  2359. memory-resident mode.  I felt that if you want disks more often
  2360. than once a year, you should pay more.  And if you wanted to
  2361. license more keyboards you should pay more.  But I also felt that
  2362. if you chose either price-increasing option, you should
  2363. automatically be entitled to the other at no extra cost.  I can't
  2364. explain it beyond that-- it's simply what seems fair to me.
  2365. Hopefully I can implement this scheme without too much confusion,
  2366. thanks to ZIPKEY's ability to figure out your subscription price
  2367. for you.
  2368.                                                               5-2
  2369.  
  2370. So your subscription fee is the greater of two qualifying
  2371. amounts: the materials fee and the license fee.
  2372.  
  2373. The materials fee is $25 for every diskette mailed to you, plus
  2374. $5 for every printed manual mailed to you.  You may copy the
  2375. contents of a single disk onto all computer systems for which you
  2376. have licensed ZIPKEY, so you do not need to order multiple copies
  2377. of the same diskette.
  2378.  
  2379. The license fee depends on the number of keyboards accessing
  2380. ZIPKEY.  Keyboards using ZIPKEY only in its demonstration mode
  2381. (ZIPKEY 2) have a one-time, perpetual license fee fee of $10.
  2382. Keyboards using ZIPKEY as a memory-resident program (hotkeys, key
  2383. playback, and/or program interface) have a sliding scale of
  2384. annual fees: $25 for the first keyboard, $20 each for the second
  2385. and third keyboards, $15 each for the next five keyboards, and
  2386. $10 each for all subsequent keyboards.
  2387.  
  2388. Again, the total charge is the maximum, NOT the sum, of the
  2389. materials and license fees.  This means, for example, that if you
  2390. would like to receive disks quarterly (materials fee $100), you
  2391. may license 5 memory-resident keyboards (license fee $95) for no
  2392. extra charge.  Conversely, if you license a lot of keyboards, you
  2393. may be able to receive disks more often for no extra charge.
  2394.  
  2395.  
  2396. Gathering Your Order Information
  2397.  
  2398. Before answering ZIPKEY's order form questions, you should take a
  2399. census of the number of keyboards you wish to license.  (I refer
  2400. to keyboards, not computers, to resolve questions raised by
  2401. networks.)  The non-resident keyboards are those from which
  2402. ZIPKEY is accessible, and from which occasional ZIPKEY 2 commands
  2403. are issued to look up zipcodes in demonstration mode, but which
  2404. the ZIPKEY 4 command is never issued.  The resident keyboards are
  2405. those for which ZIPKEY 4 is used, to install ZIPKEY in memory,
  2406. and use any or all of the following: hotkeys, keystroke playback,
  2407. or the programmatic interface.  If you use the programmatic
  2408. interface to produce an unpacked zipcode database file from
  2409. ZIPKEY.OVL, then you must also license any keyboards that access
  2410. that database file, even if they don't run ZIPKEY directly.
  2411.  
  2412. You should also decide how you will pay for your order, by
  2413. obtaining either a purchase order number or a credit card number
  2414. (Visa, Mastercard, or American Express), or by seeing to it that
  2415. you can obtain a prepaid check.  Keep in mind that you must be
  2416. either an established customer, a Fortune 1000 corporation, an
  2417. accredited school, or a government agency to issue a non-prepaid
  2418. purchase order.  Also, there is a $5 surcharge for non-prepaid
  2419. purchase orders under $100.
  2420.                                                               5-3
  2421.  
  2422. Answering the Order-Form Questionnaire
  2423.  
  2424. Now you're ready to answer the order-form questionnaire.  You'll
  2425. first be asked the number of non-resident, then resident
  2426. keyboards you are licensing. If this is a simple, one-keyboard
  2427. registration, you'll answer 1 for one of them and 0 for the
  2428. other.  If you are renewing a license, you don't need to
  2429. redeclare the non-resident keyboards-- their license is
  2430. permanent.  You do need to redeclare the resident keyboards.
  2431.  
  2432. What about keyboards that change resident vs. non-resident
  2433. status?  You declare the newly resident keyboards, and not the
  2434. newly non-resident ones.
  2435.  
  2436. Next, ZIPKEY asks for the number of printed manuals you'd like.
  2437. You may order any number from zero up to the number of keyboards
  2438. being licensed.
  2439.  
  2440. Next, ZIPKEY asks for the number of years you are paying for.  I
  2441. expect almost everyone to answer 1 to this question; but I myself
  2442. like to pay off my utilities bills for months in advance, so
  2443. maybe somebody out there will be like that.
  2444.  
  2445. ZIPKEY then asks for the number of disks per year to be
  2446. delivered.  This number multiplied by the previous number gives
  2447. the total number of disks you are paying for with this order.
  2448. You'll get one disk immediately, and the rest in evenly-spaced
  2449. periods.  The disk to be shipped exactly one year from now is
  2450. part of next year's order.
  2451.  
  2452. You are then give a choice of disk type.  Choice 1 is the
  2453. older-generation, 360K flexible-sleeve floppy.  Choice 2 is the
  2454. newer (PS/2 style) hard-shell, 720K disk.
  2455.  
  2456. You are then prompted for your name, address, and telephone
  2457. number, followed by the choices for method of payment.  If you
  2458. choose a credit card or purchase order number, you'll be prompted
  2459. for the additional information.
  2460.  
  2461. After the payment information is given, the order form is
  2462. complete.  The only remaining choice is whether to send the form
  2463. directly to the printer, or to a disk file or device.  Make sure
  2464. your printer is turned on before sending it to the printer.
  2465.  
  2466.  
  2467. Possible Amendments to the Total Price
  2468.  
  2469. The order form that ZIPKEY outputs includes the total price of
  2470. the package calculated for you.  There are only two things that
  2471. could add to the total:
  2472.  
  2473. 1. If your shipping address is in Indiana and you are not exempt,
  2474.    you must add sales tax (5% at this writing) to the total.
  2475.  
  2476. 2. If your shipping address is overseas, add $2 per disk and $3
  2477.    per manual to cover extra postage.  There is no extra charge
  2478.    for postage on domestic orders.
  2479.  
  2480. CHAPTER 6   PROGRAMMATIC INTERFACE
  2481.  
  2482.  
  2483. This chapter is intended for computer programmers who wish to
  2484. access ZIPKEY directly from within their programs.  If you are
  2485. not a computer programmer, you may ignore this chapter.
  2486.  
  2487.  
  2488. The ZIPKEY Interrupt
  2489.  
  2490. When ZIPKEY is installed as a memory-resident program (using the
  2491. ZIPKEY 4 command), it takes over one of the 8086's interrupts,
  2492. INT 179 (decimal; it's B3 in hexadecimal).  This interrupt serves
  2493. two functions: first, it is the method by which ZIPKEY detects if
  2494. it has already been installed.  Second, it provides the interface
  2495. by which computer programs can call ZIPKEY directly, to obtain
  2496. zipcode-related services.
  2497.  
  2498. I conducted a survey of numerous computers before selecting INT
  2499. 179 to be used by ZIPKEY.  I found no computers or peripherals
  2500. that use this interrupt, and I am hopeful that there are none.
  2501. If your computer does use INT 179, then ZIPKEY and the device or
  2502. program using INT 179 will interfere with each other.  You can
  2503. change the interrupt number ZIPKEY uses by modifying the ZIPKEY
  2504. program itself: the number 179 is stored in the fourth byte of
  2505. the ZIPKEY program code, immediately beyond the three-byte JMP
  2506. instruction that begins the program.  This JMP occurs at the very
  2507. start of the ZIPKEY.COM file, or immediately beyond the 512-byte
  2508. header of the ZIPKEY.EXE file.  You can use a debugger or a hex
  2509. editor to modify the byte to an unused interrupt number.
  2510.  
  2511.  
  2512. Testing for ZIPKEY's Presence
  2513.  
  2514. Before you program attempts to call ZIPKEY, it may wish to verify
  2515. that ZIPKEY has been installed, and report an error if it isn't.
  2516. Otherwise, you program may crash when it tries to call code that
  2517. isn't there.
  2518.  
  2519. You can test for ZIPKEY's presence by examining the INT 179
  2520. handler, whose doubleword pointer is stored at offset 179*4 (=716
  2521. =02CCH) within segment 0 of the 8086 memory space.  If ZIPKEY is
  2522. installed, the doubleword points to its code segment.  Location
  2523. 075H within that code segment contains the signature string
  2524. ZIPKEY.  Thus, the following code sequence will check for
  2525. ZIPKEY's presence:
  2526.                                                               6-2
  2527.  
  2528. OUR_ZIPKEY:                ; our copy of the template
  2529.   DB 'ZIPKEY'
  2530.  
  2531. CHECK_FOR_ZIPKEY:
  2532.   PUSH DS                  ; save register value
  2533.   SUB AX,AX                ; load zero
  2534.   MOV DS,AX                ; point DS to 0 -- 8086 interrupts
  2535.   MOV DS,WORD PTR 02CEH    ; fetch the segment part of INT 179
  2536.   MOV SI,075H              ; point to signature in segment
  2537.   PUSH CS                  ; push our code segment
  2538.   POP ES                   ; set ES to our code segment
  2539.   MOV DI,OFFSET OUR_ZIPKEY ; now ES:DI points to 'ZIPKEY'
  2540.   MOV CX,3                 ; there are 3 words in 'ZIPKEY'
  2541.   REPE CMPSW               ; does DS:75H point to 'ZIPKEY'?
  2542.   POP DS                   ; restore register before jumping
  2543.   JZ ZIPKEY_INSTALLED      ; jump if it does match
  2544. ZIPKEY_NOT_INSTALLED:      ; it does not match
  2545.  
  2546. Following the ZIPKEY signature, at offset 07BH within the ZIPKEY
  2547. code segment, is a single byte that is zero in the initial
  2548. version of ZIPKEY, but will increment each time I release a
  2549. ZIPKEY with new features or any other changes to the programmatic
  2550. interface.  That way, if you program needs ZIPKEY to be of a
  2551. sufficiently recent version, it can ensure that it is.  (You can
  2552. also use the version number returned by the ZK_VERSION function
  2553. described shortly.)
  2554.  
  2555.  
  2556. ZIPKEY Calling Conventions
  2557.  
  2558. ZIPKEY's interface works similarly to that of the MS-DOS
  2559. operating system, or the LIM-EMS specification.  The interface is
  2560. specified in 8086 assembly language.  You load a function number
  2561. into the AH register, and possibly other input parameters into
  2562. other registers, then you execute an INT instruction with an
  2563. appropriate interrupt number -- in ZIPKEY's case, the INT 179
  2564. instruction.
  2565.  
  2566. When ZIPKEY has completed the function, it returns control to
  2567. your program at the instruction following the INT 179.  The
  2568. success of the call is indicated by the Carry flag: NoCarry (flag
  2569. = 0) indicates success; Carry (flag = 1) indicates failure.  If
  2570. the Carry flag is set, AL is usually set to an error code (the
  2571. exceptions are those functions which, as mentioned in their
  2572. following descriptions, return the state code for a suggested
  2573. city).  Here are the possible error codes:
  2574.  
  2575. 0FDH is returned if ZIPKEY is busy.  This would happen only if
  2576.      the program calling ZIPKEY had interrupted another program
  2577.      which also happened to be in the middle of a ZIPKEY call.
  2578.      ZIPKEY is not reentrant, so it must refuse calls in this
  2579.      situation.  If you think this interrupted-programming
  2580.      scenario is possible, you should check for this possibility.
  2581.      If ZIPKEY is busy, you should give the interrupted code a
  2582.      chance to complete the ZIPKEY call, and try your call again
  2583.      later.
  2584.                                                               6-3
  2585.  
  2586. 0FEH is returned if you provided an illegal function number in
  2587.      the AH register.
  2588.  
  2589. 0FFH is returned if the searching function requested failed to
  2590.      find a valid entry, or even a suggested value.
  2591.  
  2592. Here are ZIPKEY's register-preserving conventions:  The AX
  2593. register is clobbered by an INT 179 call; but all other 8086
  2594. machine registers are preserved unless they are specifically
  2595. named as having return values.  If a function returns an error,
  2596. such return registers may be clobbered even if they contain no
  2597. values in the return case.  For example, the ZK_STCITY_ZIP
  2598. function returns values in BH, CX, and DX.  Except for AX, all
  2599. other registers not mentioned are preserved (SI,DI,BP,DS,ES).
  2600. The BH, CX, and DX registers may be clobbered even if the search
  2601. fails (and Carry is returned).
  2602.  
  2603.  
  2604. The ZIPKEY Functions
  2605.  
  2606. Following are the functions available to you when ZIPKEY is
  2607. installed. For each function, you load the input registers with
  2608. the values indicated, then invoke INT 179.
  2609.  
  2610. The names of the functions (ZK_VERSION, ZK_ABBR_ST, etc.) have no
  2611. significance to ZIPKEY-- I present them merely as suggested names
  2612. if you wish to implement a library of calls; and also so that I
  2613. can refer to the functions by name.
  2614.  
  2615. ZK_VERSION:   returns ZIPKEY version information.
  2616.  
  2617.   In: AH = 070H
  2618.  
  2619.  Out: AX = The ZIPKEY program version number, as shown when
  2620.          ZIPKEY is invoked or the ZIPKEY window is popped up.  AH
  2621.          is the major version number (to the left of the decimal
  2622.          point) and AL is the minor version number (to the right
  2623.          of the decimal point).  For example, for V1.0 the return
  2624.          AX value would be hex 100.
  2625.  
  2626.       CL = The number of states, (and territories, etc.) in the
  2627.          current database.  Each state is assigned an internal
  2628.          numeric code by ZIPKEY, that is used by many of the
  2629.          functions of ZIPKEY's programmatic interface.  These
  2630.          codes range from 0 to CL-1.
  2631.  
  2632.       DX = The date of the current ZIPKEY.OVL database.  DL is
  2633.          the month, ranging from 1 for January to 12 for
  2634.          December.  DH is the year minus 1900; e.g., decimal 89
  2635.          for 1989.
  2636.                                                               6-4
  2637.  
  2638. ZK_ABBR_ST:   converts a two-letter abbreviation into a state
  2639.               code.
  2640.  
  2641.  In:  AH = 071H
  2642.  
  2643.       BX = The 2-letter ASCII abbreviation for the state, in
  2644.          either upper- or lower-case.  BL is the first letter and
  2645.          BH is the second letter.
  2646.  
  2647. Out:  AL = The ZIPKEY state code, suitable for input to other
  2648.          ZIPKEY functions in this chapter.
  2649.  
  2650.          AL = 0FFH with the Carry flag set if not found.
  2651.  
  2652.  
  2653. ZK_ST_ABBR:   converts a state code into a two-letter
  2654.               abbreviation.
  2655.  
  2656.  In:  AH = 072H
  2657.  
  2658.       BL = The ZIPKEY state code, ranging from 0 through CL-1,
  2659.          where CL is returned by ZK_VERSION.
  2660.  
  2661. Out:  AX = The 2-letter ASCII abbreviation, upper case.  AL is
  2662.       the first letter and AH is the second letter.
  2663.  
  2664.       The Carry flag is set if the input state code BL was
  2665.       invalid.
  2666.  
  2667.  
  2668. ZK_ST_NAME:   converts a state code into a full state name.
  2669.  
  2670.  In:  AH = 073H
  2671.  
  2672.       BL = The ZIPKEY state code, as returned by ZK_ABBR_ST.
  2673.  
  2674.       ES:DI points to the buffer to contain the returned state
  2675.       name.
  2676.  
  2677. Out:  The full state name is output to ES:DI-pointed memory. DI
  2678.       is advanced beyond the output.
  2679.  
  2680.     The Carry flag is set if the input state code BL was invalid.
  2681.                                                               6-5
  2682.  
  2683. ZK_ZIP_DIGITS:  converts zipcode DXCH into a ASCII digits string.
  2684.  
  2685.  In:  AH = 074H
  2686.  
  2687.       DX = The zip region, ranging from 0 to 999.
  2688.  
  2689.       CH = The last 2 digits of the zipcode, from 0 to 99.
  2690.  
  2691. Out:  The 5 ASCII decimal digits of the zipcode are output to
  2692.       ES:DI-pointed memory.  DI advanced beyond the output.
  2693.  
  2694.       The Carry flag is set if DX was greater than 999.
  2695.  
  2696.       NOTE this is not really a database function-- it is just
  2697.       an unpacking function provided for convenience.
  2698.  
  2699.  
  2700. ZK_ZIP_ST:   looks up the state code for zipcode DXCH.
  2701.  
  2702.  In:  AH = 075H
  2703.  
  2704.       DX = The zip region, ranging from 0 to 999.
  2705.  
  2706.       CH = The last 2 digits of the zipcode, from 0 to 99.
  2707.  
  2708. Out:  AL = the ZIPKEY state code.
  2709.  
  2710.       The Carry flag is set, and AL=0FFH, if the zipcode
  2711.       region (the first three digits) is invalid.
  2712.  
  2713.       Note: for speed, this routine does not check for validity
  2714.       of the individual zipcode: it looks at only the zip
  2715.       region and the state-exceptions list.  If you wish to
  2716.       check the validity of a zipcode, use ZK_ZIP_CITY instead.
  2717.                                                               6-6
  2718.  
  2719. ZK_ZIP_CITY: looks up the state and city for zipcode DXCH.
  2720.  
  2721.  In:  AH = 076H
  2722.  
  2723.       DX = The zip region, ranging from 0 to 999.
  2724.  
  2725.       CH = The last 2 digits of the zipcode, from 0 to 99.
  2726.  
  2727.       ES:DI points to the buffer to contain the returned city
  2728.       name.
  2729.  
  2730. Out:  The ZIPKEY state code is returned in the AL register. The
  2731.       city name is output to ES:DI-pointed memory.  DI is
  2732.       advanced beyond the output.  To ensure that the name does
  2733.       not exceed a maximum width, you can set the width using the
  2734.       ZK_RESTORE function.  The Carry flag is set if the zipcode
  2735.       was not found, with AL/DI set to the suggested state/city
  2736.       if there is one.  AL is set to 0FFH if there is no
  2737.       suggested city.
  2738.  
  2739.       NOTE that a previous call to ZK_ZIP_ST can and should be
  2740.       made if you wish to suppress output for the not-found-but-
  2741.       suggested case.
  2742.  
  2743.  
  2744. ZK_ZIP_KEYS: plays the back exit key BX for the entry with
  2745.              zipcode DXCH.
  2746.  
  2747.  In:  AH = 077H
  2748.  
  2749.       BX = The 16-bit BIOS keycode for a defined ZIPKEY alternate
  2750.          exit key.  This is the code returned in the AX register
  2751.          after you call the keyboard service routine (MOV AH,0
  2752.          followed by INT 016H).  For example, the code for the F1
  2753.          function key on a 100% IBM-compatible is 03B00H; add
  2754.          0100H for subsequent function keys.
  2755.  
  2756.       DX = The zip region, ranging from 0 to 999.
  2757.  
  2758.       CH = The last 2 digits of the zipcode, from 0 to 99.
  2759.  
  2760. Out:  If there is a failure with no suggested city, ZIPKEY
  2761.       returns Carry to the caller.  Otherwise, it returns
  2762.       NoCarry, and the zipcode specification defined by the BX
  2763.       exit-key is inserted into the BIOS keystrokes buffer, as if
  2764.       a user had popped up the ZIPKEY window, typed in the
  2765.       zipcode, and exited with the BX exit key.
  2766.                                                               6-7
  2767.  
  2768. ZK_STCITY_ZIP:  looks up the zipcodes for a given state and city.
  2769.  
  2770.  In:  AH = 078H
  2771.  
  2772.       BL = The ZIPKEY state code for the city to be looked up.
  2773.  
  2774.       DS:SI points to the city-name specification.  The
  2775.           specification is a string of ASCII characters,
  2776.           terminated by a carriage-return (0DH) if the complete
  2777.           name has been given, terminated by a null (00H) if
  2778.           ZIPKEY should match any city whose name begins with the
  2779.           specification, whether or not that is the complete city
  2780.           name.  Letters in the string can be in either upper- or
  2781.           lower-case.  ZIPKEY will also unabbreviate the string,
  2782.           as described in Chapter 2.
  2783.  
  2784. Out:  ZIPKEY accumulates a list of all cities that match the
  2785.       specification given.  The list is sorted first
  2786.       alphabetically by city name, then numerically by zipcode.
  2787.       Each entry on the list is a range of zipcodes for a city
  2788.       that matches the specification.  If the first and last
  2789.       zipcodes in the range are the same, the range consists of
  2790.       just the one zipcode.  If they are different, then they
  2791.       both represent valid codes for a matching city.  Any
  2792.       zipcodes between the first and last may be either valid
  2793.       zipcodes for the same city, or undefined zipcodes.
  2794.  
  2795.       The capacity of ZIPKEY's matching-entries buffer is 50. If
  2796.       there are more than 50 entries for the specification,
  2797.       ZIPKEY will return a count of 51 entries.  You may make
  2798.       calls to ZK_CASE_ZIP to determine the entries returned, but
  2799.       be aware that unless the complete count happened to be 51,
  2800.       the list is incomplete.  The only way to obtain the
  2801.       complete list of entries is to extend the city-name
  2802.       specification by adding one or more letters in all possible
  2803.       combinations.
  2804.  
  2805.       The zipcode range for the first entry is returned with this
  2806.       call.  To obtain the remaining entries, you make repeated
  2807.       calls to ZK_CASE_ZIP.  To obtain a readable display for
  2808.       each entry, you call ZK_ZIP_CITY, ZK_ZIP_ST, and
  2809.       ZK_ZIP_DIGITS.
  2810.  
  2811. The return register values are:
  2812.  
  2813.       BH = The number of matching entries (Carry set if BH=0). If
  2814.          ZIPKEY's entries-buffer overflowed, BH is set to 51 (see
  2815.          the above discussion about capacity).
  2816.  
  2817.       DX = The zip region (0 to 999) of the first entry.
  2818.  
  2819.       CL = The value of the bottom two digits for the first
  2820.          zipcode in the range.
  2821.  
  2822.       CH = The value of the bottom two digits for the last
  2823.          zipcode in the range.
  2824.                                                               6-8
  2825.  
  2826. ZK_CITY_ZIP:   looks up zipcodes for a given city.
  2827.  
  2828.  In:  AH = 079H
  2829.  
  2830.       BL = The ZIPKEY state code of the first state to be
  2831.          searched.
  2832.  
  2833.       DS:SI points to the city-name specification, just as in
  2834.          ZK_STCITY_ZIP.
  2835.  
  2836. Out:  ZIPKEY accumulates a list of zipcode ranges, just as in
  2837.       ZK_STCITY_ZIP.  With this function, however, if no matching
  2838.       entries are found for state BL, then BL is incremented to
  2839.       search in the next state.  Searching continues until either
  2840.       a match is found or the last state code is reached.  If
  2841.       there is no matching entry for the last state, ZIPKEY
  2842.       returns AL=0FFH with the Carry flag set.  This differs from
  2843.       the city-only search that is initiated interactively from
  2844.       ZIPKEY's popup window-- the interactive search cycles
  2845.       around to the first state and continues looking from there.
  2846.  
  2847.       To get a complete list of matching cities for all states,
  2848.       you call this function first with BL=0, then repeat the
  2849.       call with BL set to the previous returned AL+1, until you
  2850.       get a failed find.
  2851.  
  2852.  
  2853. The return register values are:
  2854.  
  2855.       AL = The ZIPKEY state code of the first matching state. AL
  2856.          is set to 0FFH with Carry set if no state was found.
  2857.  
  2858.       BH = The number of matching entries (Carry set if BH=0). If
  2859.          ZIPKEY's entries-buffer overflowed, BH is set to 51.
  2860.  
  2861.       DX = The zip region (0 to 999) of the first entry.
  2862.  
  2863.       CL = The value of the bottom two digits for the first
  2864.          zipcode in the range.
  2865.  
  2866.       CH = The value of the bottom two digits for the last zipcode
  2867.          in the range.
  2868.                                                               6-9
  2869.  
  2870. ZK_CASE_ZIP:  fetches an entry from a previous ZK_(ST)CITY_ZIP
  2871.               call.
  2872.  
  2873.  In:  AH = 07AH
  2874.  
  2875.       BL = a case number, from 0 to BH-1, where BH is the number
  2876.          returned by the last call to ZK_STCITY_ZIP or
  2877.          ZK_CITY_ZIP.
  2878.  
  2879. Out:  AL = The ZIPKEY state code for this entry.  Note that this
  2880.          is the same value for all entries returned by a given
  2881.          call to ZK_STCITY_ZIP or ZK_CITY_ZIP.
  2882.  
  2883.       DX = The zip region (0 to 999).
  2884.  
  2885.       CL = The bottom 2 digits (0 to 99) of the first zipcode in
  2886.          the range.
  2887.  
  2888.       CH = the bottom 2 digits (0 to 99) of the last zipcode in
  2889.          the range. CH = CL if there is only one zipcode.
  2890.  
  2891.  
  2892. ZK_SAVE: fetches values necessary to save ZIPKEY's context.
  2893.  
  2894.  In:  AH = 07BH
  2895.  
  2896. Out:  BL = maximum number of characters for a ZK_ZIP_CITY city name.
  2897.  
  2898.       BH = the ZIPKEY state code for the last city-name search.
  2899.  
  2900.       BH = 0FF if there is no previous ZK_STCITY_ZIP or
  2901.          ZK_CITY_ZIP call.
  2902.  
  2903.       CXDX = internal codes identifying the last city search
  2904.  
  2905.       This function is provided just in case somebody wishes to
  2906.       incorporate ZIPKEY into a multitasking system, in which
  2907.       more than one task might be using ZIPKEY.  The task-
  2908.       switching code must call ZK_SAVE, record BX,CX, and DX as
  2909.       part of the task state, and feed those values to ZK_RESTORE
  2910.       before restarting the task.
  2911.  
  2912.       ZK_SAVE can also be used to read the current setting for
  2913.       the maximum city width, returned in the BL register.
  2914.                                                              6-10
  2915.  
  2916. ZK_RESTORE: restores ZIPKEY's context from a previous ZK_SAVE call.
  2917.  
  2918.  In:  AH = 07CH
  2919.  
  2920.       BL = the maximum number of characters for a city name.
  2921.  
  2922.       BH = the ZIPKEY state code returned by a previous ZK_SAVE
  2923.          call.
  2924.  
  2925.       BH = 0FF if you are just setting the city width.
  2926.  
  2927.       CXDX = internal codes returned by a previous ZK_SAVE call.
  2928.  
  2929. Out:  Carry if BH,CX,DX are not codes which could have been
  2930.       returned by a previous ZK_SAVE call
  2931.  
  2932.       This function will be used most often to set the maximum
  2933.       city width.  It is also used in multitasking systems, as
  2934.       described under the previous function ZK_SAVE.
  2935.  
  2936.  
  2937. ZK_POPUP:   pops up a ZIPKEY window from a program.
  2938.  
  2939.  In:  AH = 07DH
  2940.  
  2941.       BL = an index number if you wish to simulate the pressing of
  2942.          a hotkey.
  2943.  
  2944.       BL = 0FF for immediate popup with nothing played back after
  2945.          a confirming Enter key.
  2946.  
  2947. Out:  ZIPKEY takes action as if the hotkey indexed by BL has been
  2948.       pressed.  This typically includes popping up a window,
  2949.       waiting for the user to type a zipcode specification, and
  2950.       playing back an indicated sequence through the BIOS
  2951.       keystrokes buffer.  The values of BL are defined by the
  2952.       listing of hotkeys available from the configuration editing
  2953.       menu: BL=0 for the first hotkey, BL=1 for the second, etc.
  2954.       If BL is not a valid index ZIPKEY pops up a window, then
  2955.       plays back nothing if a confirming Enter is given (ZIPKEY
  2956.       will play back alternate exit keys, however).  ZIPKEY does
  2957.       not return from this interrupt call until the window is
  2958.       popped away-- then it returns NoCarry.
  2959.                                                              6-11
  2960.  
  2961. ZK_REGION_CITY:   outputs the name of the primary city for a
  2962.                   zipcode region.
  2963.  
  2964.  In:  AH = 07EH
  2965.  
  2966.       DX = The zip region, ranging from 0 to 999.
  2967.  
  2968.       ES:DI points to the buffer to contain the returned city
  2969.          name.
  2970.  
  2971. Out:  AL = The ZIPKEY state code for the region if the region
  2972.       exists.  The name of primary city for this region is output
  2973.       to ES:DI-pointed memory.  DI is advanced beyond the output.
  2974.       AL = 0FF with the Carry flag set if the region does not
  2975.       exist.
  2976.  
  2977.  
  2978. ZK_SWITCH:   enables/disables hotkeys.
  2979.  
  2980.  In:  AH = 07FH
  2981.  
  2982.       BL = a control code:
  2983.             0 for turn off hotkeys
  2984.             1 for turn on hotkeys
  2985.             2 for no change, just return hotkey status
  2986.             3 for toggle hotkey status
  2987.  
  2988. Out:  The activation of hotkeys is disabled/enabled/reported.
  2989.       When a hotkey is disabled ZIPKEY ignores it, and it reverts
  2990.       to its non-ZIPKEY functionality.  AL is returned set to the
  2991.       hotkeys status: 0 for off (disabled), 1 for on (enabled).
  2992.  
  2993.  
  2994.  
  2995. Sample Program Code
  2996.  
  2997. Following are fragments of assembly-language code that call
  2998. ZIPKEY's programmatic interface.  I've tried to make them
  2999. compatible with all the major assemblers, although they are
  3000. tested only against my A86 assembler. If you do use my A86
  3001. assembler, and you reuse the local labels L3, L4, and L6
  3002. elsewhere in your program, you should insert ">" into their
  3003. forward references in the following code: JC >L3; JC >L4; JMP
  3004. >L6.
  3005.  
  3006. RO_NAME:
  3007.   DB 'RO',0
  3008. NOME_NAME:
  3009.   DB 'nome',0DH
  3010.                                                              6-12
  3011.  
  3012. ; output a list of states to memory at 08000H
  3013.  
  3014. L0:
  3015.   MOV AH,070H       ; ZIPKEY function number ZK_VERSION
  3016.   INT 179           ; fetch the version information
  3017.   MOV CH,0          ; extend states count CL to CX
  3018.   MOV BL,0          ; load the first state code
  3019.   MOV DI,08000H     ; load the output pointer
  3020. L1:                 ; loop here to output each state name
  3021.   MOV AH,072H       ; ZIPKEY function number ZK_ST_ABBR
  3022.   INT 179           ; fetch the state abbreviation
  3023.   STOSW             ; output the abbreviation
  3024.   MOV AL,' '        ; load blank
  3025.   STOSB             ; output an intervening blank
  3026.   MOV AH,073H       ; ZIPKEY function number ZK_ST_NAME
  3027.   INT 179           ; output the full state name
  3028.   MOV AX,0A0DH      ; load CRLF
  3029.   STOSW             ; output CRLF to end this line
  3030.   INC BL            ; increment BL to the next state code
  3031.   LOOP L1           ; loop to output the next state
  3032.  
  3033.  
  3034. ; output to memory the list of valid zipcodes for region 474
  3035.  
  3036.   MOV DX,474        ; load the region number
  3037.   MOV DI,08000H     ; load the output pointer
  3038.   MOV CH,0          ; the first zipcode has bottom digits 00
  3039. L2:                 ; loop here to output each entry
  3040.   MOV AH,075H       ; ZIPKEY function number ZK_ZIP_ST
  3041.   INT 179           ; check the validity of this zipcode
  3042.   JC L3             ; skip if this is not a valid zipcode
  3043.   MOV BL,AL         ; zipcode valid: copy state code to BL
  3044.   MOV AH,074H       ; ZIPKEY function number ZK_ZIP_DIGITS
  3045.   INT 179           ; output the zipcode digits
  3046.   MOV AL,' '        ; load blank
  3047.   STOSB             ; output an intervening blank
  3048.   CALL CITY_ST_CRLF ; output the city, state, and CRLF
  3049. L3:
  3050.   INC CH            ; increment the bottom 2 digits counter
  3051.   CMP CH,100        ; have we completed the region?
  3052.   JB L2             ; loop if not, to output the next line
  3053.                                                              6-13
  3054.  
  3055. ; output a list of Illinois cities starting with RO
  3056.  
  3057.   MOV DI,08000H     ; load the output pointer
  3058.   MOV BX,'LI'       ; characters IL are reversed on the 8086
  3059.   MOV AH,071H       ; ZIPKEY function number ZK_ABBR_ST
  3060.   INT 179           ; fetch the state code for this abbreviation
  3061.   MOV BL,AL         ; copy the state code to BL
  3062.   PUSH CS           ; push our code segment
  3063.   POP DS                 ; set DS to our code segment
  3064.   MOV SI,OFFSET RO_NAME  ; point to "RO" city specification
  3065.   MOV AH,078H            ; ZIPKEY function number ZK_STCITY_ZIP
  3066.   INT 179           ; get the list of entries for this city
  3067.   JC L4             ; skip if the list was empty
  3068.   CALL OUT_ENTRIES
  3069. L4:
  3070.  
  3071.  
  3072. ; output a list of Nomes in the United States
  3073.  
  3074.   MOV DI,08000H            ; load the output pointer
  3075.   PUSH CS                  ; push our code segment
  3076.   POP DS                   ; set DS to our code segment
  3077.   MOV SI,OFFSET NOME_NAME  ; point to "Nome" specification
  3078.   MOV BL,0                 ; first state code is zero
  3079.   JMP L6                   ; jump into loop
  3080.  
  3081. L5:                        ; loop here for each matching state
  3082.   PUSH AX                  ; save the state code
  3083.   CALL OUT_ENTRIES         ; output the entries for this state
  3084.   POP BX                   ; restore the state code to BL
  3085.   INC BX                   ; increment to the next state
  3086. L6:
  3087.   MOV AH,079H              ; ZIPKEY function number ZK_CITY_ZIP
  3088.   INT 179                  ; find a state with the desired city
  3089.   JNC L5                   ; loop if found, to make display
  3090.  
  3091.  
  3092. ; set the maximum city width to 17
  3093.  
  3094.   MOV BL,17         ; load the desired city width
  3095.   MOV BH,0FFH       ; code signals that we load width only
  3096.   MOV AH,07CH       ; ZIPKEY function number ZK_RESTORE
  3097.   INT 179           ; set the city width
  3098.                                                              6-14
  3099.  
  3100. ; save and restore ZIPKEY context
  3101.  
  3102.   MOV AH,07BH       ; ZIPKEY function number ZK_SAVE
  3103.   INT 179           ; fetch the ZIPKEY context
  3104.   PUSH BX           ; push the context onto our stack
  3105.   PUSH CX
  3106.   PUSH DX
  3107. ; ....
  3108.   POP DX            ; pop the saved context
  3109.   POP CX
  3110.   POP BX
  3111.   MOV AH,07CH       ; ZIPKEY function number ZK_RESTORE
  3112.   INT 179           ; restore the ZIPKEY context
  3113.  
  3114.  
  3115. ; popup a window as if the first hotkey were pressed
  3116.  
  3117.   MOV AH,07DH       ; ZIPKEY function number ZK_POPUP
  3118.   MOV BL,0          ; index for the first hotkey is zero
  3119.   INT 179           ; popup the ZIPKEY window
  3120.  
  3121.  
  3122. ; insert keystrokes for zipcode 47401, as if alternate
  3123. ;   exit key F1 had been pressed
  3124.  
  3125.   MOV DX,474        ; load the region number 474
  3126.   MOV CH,01         ; load the last two digits 01
  3127.   MOV BX,03B00      ; load the BIOS code for the F1 key
  3128.   MOV AH,077H       ; ZIPKEY function number ZK_ZIP_KEYS
  3129.   INT 179           ; insert keystrokes for 47401 entry
  3130.  
  3131.  
  3132. ; toggle the activation of ZIPKEY's hotkeys
  3133.  
  3134.   MOV BL,3          ; control code for "toggle"
  3135.   MOV AH,07FH       ; ZIPKEY function number ZK_SWITCH
  3136.   INT 179           ; toggle the activation of hotkeys
  3137.  
  3138.  
  3139.  
  3140. CITY_ST_CRLF:       ; subroutine for outputting a city line
  3141.   MOV AH,076H       ; ZIPKEY function number ZK_ZIP_CITY
  3142.   INT 179           ; output the city name
  3143.   MOV AL,' '        ; load blank
  3144.   STOSB             ; output an intervening blank
  3145.   MOV AH,072H       ; ZIPKEY function number ZK_ST_ABBR
  3146.   INT 179           ; fetch the state abbreviation
  3147.   STOSW             ; output the state abbreviation
  3148.   MOV AX,0A0D       ; load CRLF
  3149.   STOSW             ; output CRLF to end this line
  3150.   RET
  3151.                                                              6-15
  3152.  
  3153. OUT_ENTRIES:        ; subroutine for outputting a cities-range
  3154.   MOV BL,0          ; load the first entry number
  3155. L7:                 ; loop here to output each entry
  3156.   PUSH BX           ; save the entry number during output
  3157.   PUSH DI           ; save the starting output pointer
  3158.   ADD DI,5          ; advance beyond the zipcode we will output
  3159.   MOV AX,'  '       ; load blanks
  3160.   STOSW             ; blank out the trailing range slot
  3161.   STOSW             ; slot plus trailing blank are 4 characters
  3162.   POP DI            ; restore the pointer to the line start
  3163.   MOV AH,07AH       ; ZIPKEY function number ZK_CASE_ZIP
  3164.   INT 179           ; look up this entry
  3165.   MOV BL,AL         ; copy the state code to BL
  3166.   CMP CL,CH         ; is there only one zipcode?
  3167.   JE L8             ; skip if single zipcode: slot stays blank
  3168.   PUSH DI           ; it is a range: save output pointer
  3169.   ADD DI,3          ; advance the output pointer
  3170.   MOV AH,074H       ; ZIPKEY function number ZK_ZIP_DIGITS
  3171.   INT 179           ; output the end-value zipcode digits
  3172.   POP DI            ; restore starting output pointer
  3173.   ES MOV BYTE PTR [DI+5],'-' ; place the trailing hyphen
  3174.   MOV CH,CL         ; copy the start-value to CH
  3175. L8:
  3176.   MOV AH,074H       ; ZIPKEY function number ZK_ZIP_DIGITS
  3177.   INT 179           ; output the start-value zipcode digits
  3178.   ADD DI,4          ; advance beyond the end-value slot
  3179.   CALL CITY_ST_CRLF ; output the city, state, CRLF
  3180.   POP BX            ; restore the entry number BL
  3181.   INC BL            ; increment the entry number
  3182.   CMP BL,BH         ; have we exhausted the entries?
  3183.   JB L7             ; loop if not, to output the next entry
  3184.   RET
  3185.  
  3186. INDEX                                                  7-1
  3187. A-specifier for playback, 3-11
  3188. Aaron, AL, 2-8
  3189. abbreviating a city name, 3-11
  3190. abbreviation, 2-letter, playback, 3-11
  3191. abbreviation, state-code to, 6-4
  3192. abbreviation-to-state code, 6-4
  3193. abbreviations in database, 2-8
  3194. abbreviations, state, finding, 2-5
  3195. aborting a search (Esc), 2-1
  3196. about the author, 1-8
  3197. AboveBoard, 3-3
  3198. address, my, 1-8
  3199. AH function number, 6-2
  3200. aligning to a city name, 3-12
  3201. Alt key in hotkeys, 3-7
  3202. Alt-backquote hotkey example, 3-15
  3203. alternate exit keys, 3-13
  3204. alternate hotkeys, 3-12
  3205. alternate window, 3-5
  3206. amendments to total price, 5-3
  3207. answering the order-form questionnaire, 5-3
  3208. ARC files, 1-7
  3209. arrow keys during configuration, 3-5
  3210. arrow keys during state/city search, 2-7
  3211. arrow keys during zipcode search, 2-4
  3212. asterisk during fixed key entry, 3-10
  3213. asterisk, literal playback, 3-11
  3214. atlas sources, 1-5
  3215. ATTRIB command, use with networks, 4-7
  3216. author, contacting, 1-8
  3217. AUTOEXEC.BAT file, 4-4
  3218. automatic ZIPKEY installation, 4-4
  3219. availability, permanent, 4-4
  3220. B-specifier for playback, 3-11
  3221. back-quote hotkey, 3-7
  3222. backing up your data, 1-4
  3223. backquote hotkey example, 3-15
  3224. backspace and escaped hotkey code, 3-8
  3225. backspace generation on playback, 3-11
  3226. Barney, GA example, 4-2
  3227. BBS distribution, 1-7
  3228. big cities, zipcodes for, 2-6
  3229. biography, 1-8
  3230. blank-padding example , 3-16
  3231. blank-padding of city name, 3-11
  3232. Borland Reflex, 3-10
  3233. Borland TSRs, 4-5
  3234. Borland, 3-5
  3235. bugs, reporting, 1-9
  3236. bulletin boards, my, 1-9
  3237. busy error code, 6-2
  3238. buying a copy of ZIPKEY, 5-1
  3239. C-specifier for playback, 3-11
  3240. calling conventions, 6-2
  3241. calling ZIPKEY from programs, 6-1
  3242. cancelling a window (Esc), 2-1
  3243. capacity of cities display, 2-5
  3244.                                                        7-2
  3245. Carry flag return status, 6-2
  3246. case sensitivity, 2-5
  3247. CBIS network, problems with, 3-3
  3248. charges for ZIPKEY, 5-1
  3249. CHECK_FOR_ZIPKEY code example, 6-2
  3250. cities display capacity, 2-5
  3251. cities listing example, 6-12
  3252. cities, guessed, 2-3
  3253. cities, large, zipcodes for, 2-6
  3254. cities, listing, 2-3
  3255. city lookup function, 6-5
  3256. city name in playback, 3-11
  3257. city name, abbreviating, 3-11
  3258. city name, longest in database, 3-11
  3259. city only search, 2-7
  3260. city width, program set, 6-9
  3261. city-line subroutine, 6-14
  3262. city-list subroutine, 6-14
  3263. city-only failed find, 2-7
  3264. city-only lookup function, 6-7
  3265. city/state/zip format, 3-10
  3266. club, beat over the head with, 5-1
  3267. color of window, 3-6
  3268. color vs. monochrome video modes, 3-6
  3269. COM vs. EXE file, 1-6
  3270. compilation copyright, 1-6
  3271. completing a zipcode, 2-6
  3272. conditions for distribution, 1-4
  3273. Condor compatibility, 3-5
  3274. configuration editing menu, 3-13
  3275. configuration, creating, 3-2
  3276. configuration, large, 4-4
  3277. configurations, re-installing, 4-3
  3278. configuring ZIPKEY, 3-1
  3279. contacting me, 1-8
  3280. contents, 0-2
  3281. context saving, 6-9
  3282. context setting example, 6-13
  3283. copyright of database, 1-5
  3284. correcting hotkeys, 4-3
  3285. correcting keyboard slowdown, 4-3
  3286. correcting your configuration, 4-2
  3287. Ctrl key in hotkeys, 3-7
  3288. current drive and directory, 4-5
  3289. cursor during next-state search, 2-7
  3290. customizing ZIPKEY, 3-1
  3291. data source, changing, 4-3
  3292. data, possible sources of, 3-3
  3293. database example, playback, 3-12
  3294. database manager example, 3-1
  3295. database, sources and copyright, 1-5
  3296. date, detecting OVL, 6-3
  3297. Dear example, 3-11
  3298. default options during configuration, 3-2
  3299. demonstration mode, 2-1
  3300. detecting ZIPKEY's version, 6-2
  3301. determining needs, 3-1
  3302.                                                        7-3
  3303. differences, evaluation vs. registered, 1-6
  3304. digits output function, 6-5
  3305. directories, sources, 1-5
  3306. disabling other resident programs, 4-5
  3307. disk storage of zipcodes, 3-3
  3308. diskettes, charge for, 5-2
  3309. disks, 3.5" vs. 5.25", 5-3
  3310. disks, number ordered, 5-3
  3311. display of hotkey name, wrong, 3-8
  3312. display of intermediate results, 3-4
  3313. distribution conditions, 1-4
  3314. distribution houses, shareware, 0-2
  3315. distribution naming conventions, 1-7
  3316. down-arrow during city search, 2-7
  3317. down-arrow during zipcode search, 2-4
  3318. East, unabbreviation, 2-8
  3319. editing menu, configuration, 3-13
  3320. electronic mail, 1-9
  3321. EMS memory, 3-3
  3322. Enter key during configuration choices, 3-2
  3323. Enter key during fixed key entry, 3-10
  3324. Enter key during playback specification, 3-12
  3325. Enter key in demonstration mode, 2-1
  3326. entries-lookup function, 6-8
  3327. error codes, program, 6-2
  3328. escaping from a window, 2-1
  3329. evaluation copy of ZIPKEY, 1-4
  3330. evaluation period, length of, 1-4
  3331. evaluation vs. registered differences, 1-6
  3332. examples, programming, 6-11
  3333. EXE vs. COM file, 1-6
  3334. existing zipcode, looking up, 3-9
  3335. exit keys, alternate, 3-13
  3336. exit keys, programmatic invoke, 6-6
  3337. expiration of evaluation, 5-1
  3338. expiration of subscription, 5-1
  3339. exploration keys, 2-4
  3340. F-specifier example , 3-16
  3341. F-specifier following city width, 3-11
  3342. F11 and F12 as hotkeys, 3-7
  3343. failed-find program error code, 6-3
  3344. fees for using ZIPKEY, 5-1
  3345. Fife, VA example, 4-2
  3346. files, how ZIPKEY finds, 4-5
  3347. finding a city only, 2-7
  3348. finding state abbreviations, 2-5
  3349. finding state/city, 2-5
  3350. finding zipcodes, 2-2
  3351. finding ZIPKEY files on your disk, 4-5
  3352. fixed field example, 3-16
  3353. fixed zipcode, 3-9
  3354. fixed-keystroke source for hotkey, 3-9
  3355. format of city/state/zip playback, 3-10
  3356. Fort, unabbreviation, 2-8
  3357. frequency of disk updates, 5-3
  3358. full name of state, playback, 3-12
  3359. full name-to-state code, 6-4
  3360.                                                        7-4
  3361. function keys during configuration, 3-6
  3362. function keys, exiting ZIPKEY with, 3-13
  3363. functions, programming, 6-3
  3364. gathering order information, 5-2
  3365. generating an order form, 5-1
  3366. global settings, definition, 3-6
  3367. graphics mode usage, 3-10
  3368. guessed cities, 2-3
  3369. Home key, 2-1
  3370. hotkey configuration, 3-6
  3371. hotkey echoing, wrong display, 3-8
  3372. hotkey enable/disable example, 6-13
  3373. hotkey name, 3-7
  3374. hotkey, definition, 1-2
  3375. hotkeys, disable/enable, 6-11
  3376. hotkeys, more than one, 3-12
  3377. how to contact me, 1-8
  3378. how to create a ZC file, 3-2
  3379. how to order, 5-1
  3380. illegal function number error code, 6-3
  3381. incompatible programs with ZIPKEY, 1-3
  3382. indented addresses, 3-12
  3383. InDOS flag, 3-3
  3384. installation, testing for, 6-1
  3385. installing files on a network, 4-7
  3386. Intel, 1-8
  3387. Intel, 3-3
  3388. interfacing your programs to ZIPKEY, 6-1
  3389. interference of other programs, 4-4
  3390. interference via interrupts, 6-1
  3391. intermediate results for zipcode, 2-2
  3392. intermediate results, city-only, 2-7
  3393. intermediate results, suppressing, 3-4
  3394. interrupt number, changing, 6-1
  3395. interrupt, ZIPKEY, 6-1
  3396. invoice, generating, 5-1
  3397. Jeffersonville example, 2-3
  3398. key playback from a program, 6-6
  3399. keyboard interference, 4-4
  3400. keyboard slowdown, 3-5
  3401. keyboards, licensing, 5-2
  3402. keystroke playback sequence, 3-10
  3403. keystrokes, determining, 3-1
  3404. King and Queen Court House, VA, 3-11
  3405. L-specifier for playback, 3-11
  3406. LAN compatibility, 3-3
  3407. large cities, zipcodes for, 2-6
  3408. large configuration, changing to, 4-4
  3409. last-keystrokes source for hotkey, 3-10
  3410. Left vs. Right keys, 3-7
  3411. legal conditions for distribution, 1-4
  3412. legal terms, 1-4
  3413. length of city name, specifying, 3-11
  3414. length of subscription, 5-3
  3415. letters, fixed playback, 3-11
  3416. liabilities, 1-4
  3417. license length, 1-4
  3418.                                                        7-5
  3419. license, how to obtain, 5-1
  3420. LIM-EMS memory, 3-3
  3421. limitations, 1-2
  3422. listing cities example, 6-12
  3423. listing cities, 2-3
  3424. listing regions, 2-2
  3425. listing states example, 6-11
  3426. listing zipcodes example, 6-12
  3427. literalizing during playback, 3-11
  3428. local zipcode option, 3-9
  3429. location of window, 3-5
  3430. longest city name in database, 3-11
  3431. looking up a city only, 2-7
  3432. looking up a zipcode, 2-1
  3433. looking up state abbreviations, 2-5
  3434. looking up state/city, 2-5
  3435. looking up zipcodes, 2-2
  3436. Lotus-Intel-Microsoft memory, 3-3
  3437. Louisville example, 2-3
  3438. lower vs. upper sensitivity, 2-5
  3439. mail, electronic, 1-9
  3440. main city of a region, 2-3
  3441. main memory for zip data, 3-4
  3442. main menu option 2, 2-1
  3443. main menu option 3, 3-2
  3444. main menu option 4, 4-1
  3445. main menu option 5, 5-1
  3446. main menu option 7, 4-3
  3447. making ZIPKEY permanently available, 4-4
  3448. manual, overview, 1-1
  3449. manuals, charge for, 5-2
  3450. materials fee, 5-2
  3451. maximum city name size, 3-11
  3452. memory model, 3-3
  3453. memory model, changing, 4-3
  3454. memory requirements, 1-3
  3455. memory-resident mode, definition, 1-2
  3456. memory-resident mode, running, 4-1
  3457. memory-resident programs, other, 4-4
  3458. memory-resident use, configuring, 3-2
  3459. Microsoft Word 4.0 problem, 1-3
  3460. Microsoft Works, 1-3
  3461. Microsoft, 3-3
  3462. might-be cities, 2-3
  3463. missing characters, correcting, 3-5
  3464. missing playback keys, 4-2
  3465. modifications, see if you made, 3-14
  3466. modifying configuration files, 3-14
  3467. money, how to send, 5-1
  3468. monochrome vs. color video modes, 3-6
  3469. more hotkey examples, 3-15
  3470. Mount, unabbreviation, 2-8
  3471. moving from state to state, 2-7
  3472. multiple configuration files, 3-14
  3473. multiple hotkeys, 3-12
  3474. multiple-zipcode cities, 2-6
  3475. multitasking programming, 6-9
  3476.                                                        7-6
  3477. N-specifier following city width, 3-11
  3478. name of hotkey, wrong display, 3-8
  3479. named configuration files, 3-14
  3480. naming conventions for distribution, 1-7
  3481. National Park abbreviation, 2-8
  3482. network compatibility, 3-3
  3483. Network-OS, problems with, 3-3
  3484. networks, optimizing for, 4-7
  3485. Nome example, 2-7
  3486. Nomes list example, 6-12
  3487. North, unabbreviation, 2-8
  3488. num 5 hotkey, 3-4
  3489. number of states, 6-3
  3490. numlock on option, 3-4
  3491. operating requirements, 1-3
  3492. order form invitation, 1-6
  3493. order form, generating, 5-1
  3494. other memory-resident programs, 4-4
  3495. overseas postage, 5-3
  3496. overview of manual, 1-1
  3497. overview of ZIPKEY, 1-1
  3498. OVL date, detecting, 6-3
  3499. OVL file, how ZIPKEY finds, 4-6
  3500. OVL too new, 1-7
  3501. padding example, 3-16
  3502. padding of a city name, 3-11
  3503. paging keys, cities search, 2-5
  3504. paging keys, zipcode search, 2-4
  3505. PAK files, 1-7
  3506. PATH command, 4-6
  3507. PATH directory, putting ZIPKEY in, 4-7
  3508. payment for ZIPKEY, 5-1
  3509. permanent installation, 4-4
  3510. PgDn/PgUp in cities search, 2-5
  3511. PgDn/PgUp keys, zipcode search, 2-4
  3512. phone numbers of bulletin boards, 1-9
  3513. playback keys, missing, 4-2
  3514. playback of keystrokes, specifying, 3-10
  3515. playback unrelated to zipcodes, 3-15
  3516. playback, programmatic invoke, 6-6
  3517. pop up window from program, 6-10
  3518. pop-up window option for hotkey, 3-8
  3519. postage, adding overseas, 5-3
  3520. presence, testing for ZIPKEY's, 6-1
  3521. price notification policy, 1-4
  3522. price, amendments to, 5-3
  3523. prices, schedule of, 5-1
  3524. primary region-city lookup, 6-10
  3525. printed manuals, charge for, 5-2
  3526. printout of configuration (ZQR), 3-14
  3527. program code, sample, 6-11
  3528. program error codes, 6-2
  3529. program key insert example, 6-13
  3530. program popup example, 6-13
  3531. program width example, 6-13
  3532. programmatic interface, 6-1
  3533. programmed popup function, 6-10
  3534.                                                        7-7
  3535. prohibitions, specific, 1-5
  3536. Prokey 2.1 incompatibility, 1-3
  3537. ProKey, 3-5
  3538. publishing database, don't, 1-6
  3539. purchase orders, qualifying for, 5-2
  3540. question mark, 2-7
  3541. questionnaire, order-form, 5-3
  3542. quick-reference document, 3-14
  3543. quitting a search (Esc), 2-1
  3544. quotes mark at signon window, 2-8
  3545. R-specifier for playback, 3-12
  3546. ranges of zipcodes, 2-6
  3547. re-installing ZIPKEY, 4-3
  3548. read-only attribute, setting, 4-7
  3549. reference guide, definition, 1-1
  3550. references for database, 1-5
  3551. Reflex, Borland, 3-10
  3552. region city, primary lookup, 6-10
  3553. regions, definition of, 2-3
  3554. regions, listing, 2-2
  3555. register-saving conventions, 6-3
  3556. registered copy of ZIPKEY, 1-4
  3557. registering, how to, 5-1
  3558. release date, 0-1
  3559. removing ZIPKEY from memory, 4-3
  3560. repeat last zipcode, 2-8
  3561. repeat zipcode, example, 3-15
  3562. repeat-zipcode hotkeys, 3-9
  3563. requirements for operation, 1-3
  3564. resident programs, disabling other, 4-5
  3565. resident programs, other, 4-4
  3566. resident vs. non-resident, changing, 5-3
  3567. restarting computer, when needed, 4-3
  3568. restore context example, 6-13
  3569. restoring context, 6-9
  3570. retreat to start of city name, 3-12
  3571. Right vs. Left keys, 3-7
  3572. Robinson, IL example, 2-5
  3573. running memory-resident ZIPKEY, 4-1
  3574. S-specifier for playback, 3-12
  3575. Saint(e), unabbreviation, 2-8
  3576. sales tax, adding, 5-3
  3577. sample program code, 6-11
  3578. samples for keystrokes, 3-1
  3579. save/restore context example, 6-13
  3580. schedule of prices, 5-1
  3581. screen distractions, 3-4
  3582. screen, zipcode from, 3-9
  3583. search: city to state/zip, 2-7
  3584. search: state/city to zip, 2-5
  3585. search: zip to city, 2-2
  3586. send money, how to, 5-1
  3587. SET PATH command, 4-6
  3588. shareware, nature of, 0-2
  3589. Shift keys in hotkeys, 3-7
  3590. shredded wheat example, 2-7
  3591. Sidekick and uninstall, 4-3
  3592.                                                        7-8
  3593. Sidekick must be after ZIPKEY, 4-5
  3594. Sidekick, 3-7
  3595. signature, ZIPKEY's, 6-1
  3596. signon window, 2-1
  3597. signon window, quotes mark, 2-8
  3598. signon window, returning to, 2-1
  3599. six-months prohibition, 1-7
  3600. Sizzleware, 1-5
  3601. slow down keyboard, 3-5
  3602. SmartKey, 3-5
  3603. sources of database, 1-5
  3604. sources of ZIPKEY's data, 3-3
  3605. South, unabbreviation, 2-8
  3606. speed of zipcode lookup, 3-4
  3607. state abbreviations, finding, 2-5
  3608. state code, abbreviation-to-, 6-4
  3609. state code-to-abbreviation, 6-4
  3610. state code-to-full name, 6-4
  3611. state lookup function, 6-5
  3612. state name playback, 3-12
  3613. state-and-city search, 2-5
  3614. states listing example, 6-11
  3615. states, getting total number, 6-3
  3616. streets, lack of, 1-2
  3617. subroutines, 6-14
  3618. subscribe, how to, 5-1
  3619. Superkey must be before ZIPKEY, 4-5
  3620. surcharge for purchase orders, 5-2
  3621. SysReq hotkey, 3-7
  3622. system requirements, 1-3
  3623. table of contents, 0-2
  3624. tax, adding, 5-3
  3625. telephone directories, 1-5
  3626. telephone numbers, bulletin board, 1-9
  3627. testing for ZIPKEY installation, 6-1
  3628. toggle hotkey-enable, 6-11
  3629. toggle hotkeys example, 6-13
  3630. too many cities display, 2-5
  3631. total price, amendments to, 5-3
  3632. trouble: computer freezes up, 4-4
  3633. trouble: interrupt interference, 6-1
  3634. trouble: many playback keys missed, 4-2
  3635. trouble: playback in wrong fields, 4-2
  3636. trouble: window doesn't pop up, 4-4
  3637. TSRs (memory resident programs), 4-4
  3638. Turbo Pascal, 3-5
  3639. tutorial, definition, 1-1
  3640. two-letter state abbreviation, playback, 3-11
  3641. typeahead in Word 4.0, 1-3
  3642. U. S. Census, 1-5
  3643. unabbreviation, 2-8
  3644. undefined zipcodes within ranges, 2-6
  3645. uninstalling ZIPKEY, 4-3
  3646. unpacked database, licensing, 5-2
  3647. unpacking the database, 1-6
  3648. up-arrow during city search, 2-7
  3649. up-arrow during zipcode search, 2-4
  3650.                                                        7-9
  3651. updates, frequency of, 5-3
  3652. upper vs. lower sensitivity, 2-5
  3653. Ventura Desktop Publisher, 3-10
  3654. version function, 6-3
  3655. version number, "e" vs. "r", 1-6
  3656. version, detecting via program, 6-2
  3657. video modes: color vs. monochrome, 3-6
  3658. video screen, zipcode from, 3-9
  3659. West, unabbreviation, 2-8
  3660. Wettstein, Greg, 1-9
  3661. what ZIPKEY doesn't do, 1-2
  3662. width of city name, specifying, 3-11
  3663. window characteristics, 3-5
  3664. window prompts, 2-2
  3665. Worcester, MA example, 2-6
  3666. Word 4.0 typeahead, 1-3
  3667. word processor example, 3-2
  3668. Wordstar compatibility, 3-5
  3669. Works, Microsoft, 1-3
  3670. wrong display of hotkey name, 3-8
  3671. x's to complete a zipcode, 2-6
  3672. Z and C hotkey, 3-8
  3673. Z-specifier for playback, 3-11
  3674. ZC file, how to create, 3-2
  3675. ZC file, large, 4-4
  3676. ZC files, how ZIPKEY finds, 4-6
  3677. zero zipcode output, 2-8
  3678. ZIP files, 1-7
  3679. zip-to-city search, 2-2
  3680. zipcode from screen, 3-9
  3681. zipcode from screen, example, 3-15
  3682. zipcode listing example, 6-12
  3683. zipcode lookup function, 6-6
  3684. zipcode lookup, city-only, 6-7
  3685. zipcode playback, 3-11
  3686. zipcode source for a hotkey, 3-8
  3687. zipcode-to-city function, 6-5
  3688. zipcode-to-state function, 6-5
  3689. ZIPKEY 2 command, 2-1
  3690. ZIPKEY 3 command, 3-2
  3691. ZIPKEY 4 command, 4-1
  3692. ZIPKEY 5 command, 5-1
  3693. ZIPKEY 7 command, 4-3
  3694. ZIPKEY and other resident programs, 4-4
  3695. ZIPKEY calling conventions, 6-2
  3696. ZIPKEY configuration, 3-1
  3697. ZIPKEY functions, 6-3
  3698. ZIPKEY in computer's memory, 3-3
  3699. ZIPKEY interrupt, 6-1
  3700. ZIPKEY.COM vs. ZIPKEY.EXE, 1-6
  3701. ZK_ABBR_ST function, 6-4
  3702. ZK_CASE_ZIP function, 6-8
  3703. ZK_CITY_ZIP function, 6-7
  3704. ZK_POPUP function, 6-10
  3705. ZK_REGION_CITY function, 6-10
  3706. ZK_RESTORE function, 6-9
  3707. ZK_SAVE function, 6-9
  3708.                                                        7-10
  3709. ZK_STCITY_ZIP function, 6-6
  3710. ZK_ST_ABBR function, 6-4
  3711. ZK_ST_NAME function, 6-4
  3712. ZK_SWITCH function, 6-11
  3713. ZK_VERSION function, 6-3
  3714. ZK_ZIP_CITY function, 6-5
  3715. ZK_ZIP_DIGITS function, 6-5
  3716. ZK_ZIP_KEYS function, 6-6
  3717. ZK_ZIP_ST function, 6-5
  3718. ZOO files, 1-7
  3719. ZQR file, 3-14
  3720. ZQR file, name of, 3-14
  3721.